在堆上声明二维向量

时间:2013-09-13 17:05:55

标签: c++

在堆上声明二维向量

第一种方法:

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;

哪种方法合适? 如何删除二维向量?

3 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:1)

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

答案 2 :(得分: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");
    }
}