1

在堆上声明一个二维向量

第一种方法:

vector< vector<CString> *> * lstTableContent = new vector< vector<CString> *>();
int nNumColumns = 10;
int nNumRows = 10;
for (int i = 1; i <= nNumRows ; i++)
{
    vector<CString> *lstTableRow = new vector<CString>();
    for (int j = 1; j <= nNumColumns ; j++)
    {
        lstTableRow->push_back("ITEM");
    }
    lstTableContent->push_back(lstTableRow);
}
return lstTableContent;

第二种方法:

vector< vector<CString> > * lstTableContent = new vector< vector<CString> >();
int nNumColumns = 10;
int nNumRows = 10;
for (int i = 1; i <= nNumRows ; i++)
{
    vector<CString> lstTableRow;
    for (int j = 1; j <= nNumColumns ; j++)
    {
        lstTableRow.push_back("ITEM");
    }
    lstTableContent->push_back(lstTableRow);
}
return lstTableContent;

哪种方法是正确的?如何删除二维向量?

4

3 回答 3

4

更好的方法

vector< vector<CString>> lstTableContent;
int nNumColumns = 10;
int nNumRows = 10;
for (int i = 1; i <= nNumRows ; i++)
{
    vector<CString> lstTableRow;
    for (int j = 1; j <= nNumColumns ; j++)
    {
        lstTableRow.push_back("ITEM");
    }
    lstTableContent.push_back(lstTableRow);
}

当 lstTableContent 超出范围时,所有内容都会被正确销毁。

否则,您必须在删除向量向量之前循环遍历向量并删除单个向量(您的选项 1),或者在超出范围并删除向量之前遍历向量向量(您的选项 2 )。

于 2013-09-13T17:14:59.677 回答
1

第一种方法在删除时应该更好,因为每个元素都只是被引用,因此破坏引用将破坏对象。

于 2013-09-13T17:08:58.960 回答
1
// unsigned size type
const unsigned nNumRows = 10;
// unsigned size type
const unsigned nNumColumns = 10;

vector< vector<CString> > v(nNumRows);
// C/C++ starts counting at zero and ++i for good habit:
for (unsigned i = 0; i < nNumRows ; ++i)
{
    vector<CString>& col = v[i];
    col.reserve(nNumColumns); 
    // Again: C/C++ starts counting at zero and ++j for good habit:
    for (unsigned j = 0; j < nNumColumns ; ++j)
    {
        col.push_back("ITEM");
    }
}
于 2013-09-13T17:28:04.390 回答