C++ 在堆上声明二维向量

C++ 在堆上声明二维向量,c++,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< 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;
vector*lstablecontent=newvector();
int nNumColumns=10;
int nNumRows=10;
for(int i=1;i向后推_(lstTableRow);
}
返回表格内容;
第二种方法:

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;
vector*lstablecontent=newvector();
int nNumColumns=10;
int nNumRows=10;

对于(int i=1;i第一种方法在删除时应该更好,因为每个元素都刚刚被引用,因此销毁引用将销毁对象。

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

更好的方法

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);
}
vectorlstablecontent;
int nNumColumns=10;
int nNumRows=10;

对于(inti=1;i更好的方法

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);
}
vectorlstablecontent;
int nNumColumns=10;
int nNumRows=10;
对于(int i=1;i
//无符号大小类型
常量无符号nNumRows=10;
//无符号大小类型
常量无符号nNumColumns=10;
向量v(nNumRows);
//C/C++从零开始计数,++i作为良好习惯:
for(无符号i=0;i
//无符号大小类型
常量无符号nNumRows=10;
//无符号大小类型
常量无符号nNumColumns=10;
向量v(nNumRows);
//C/C++从零开始计数,++i作为良好习惯:
for(无符号i=0;i
<代码> >不需要用<代码> < <代码> >创建<代码> vector <代码>。因为它管理内存,所有元素都是堆的。适当的是适合你需要的。没有任何理由使用“代码”>新的<代码>,无论是外部还是内部向量。@东东:在现代C++中,返回向量将移动它,并且将(或多或少)与返回指针一样高效。即使您使用的是不支持移动语义的旧编译器,也应该删除副本(使其更加高效),除非你的函数有多个返回,返回不同的值。乱搞
new
会打开内存泄漏的大门,只需很少或根本不需要benefit@dongx您应该阅读有关引用的内容,它类似于指针,但更安全。在某些情况下,用法与指针不同。您不需要使用<代码>新< /COD>。因为它管理内存,所有元素都是堆的。适当的是适合你需要的。没有任何理由使用<代码>新< /代码>为外部或内部向量。@东东:在现代C++中,返回向量将移动它,并且将(或多或少)。与返回指针一样高效。即使您使用的是不支持移动语义的旧编译器,也应该删除副本(使其更加高效),除非你的函数有多个返回,返回不同的值。乱搞
new
会打开内存泄漏的大门,只需很少或根本不需要benefit@dongx您应该阅读有关引用的内容,它类似于指针,但更安全。在某些情况下,用法也不同于指针。如果我想返回lstTableContent。是否使用g一个指向向量向量的点在传递向量时效率更高?@dongx你只需返回向量本身。副本将被省略。它将比返回指针更有效。这将取决于向量的大小。通常,是的,将指针返回向量将更有效,因为se您不必在传递向量时使用复制构造函数(创建向量的多个副本)。如果您有理由认为在这方面需要提高效率,请查看智能指针类(例如,
unique\u ptr
,“shared\u ptr”等),而不是原始指针。即使在这里也没有错:“for”(inti=1;i@DieterLücking:这不应该令人担忧。它与(inti=0;i相同)
。如果我想返回lstTableContent。在传递向量时,使用指向向量向量的点会更有效吗?@dongx您只需返回向量本身。副本将被省略,它将比返回指针更有效。这将取决于向量的大小。通常,是的,返回使用指向向量的指针将更有效,因为在传递向量时不必使用复制构造函数(创建向量的多个副本)。如果您有理由认为需要在这方面提高效率,请查看智能指针类(例如
unique\u ptr
,“shared\u ptr”等)而不是原始指针。即使在这里它也没有错:'for(int i=1;i@DieterLücking:它不应该令人担忧。它与(int i=0;i相同
。由于他从未使用计数器引用向量中的项目,基于0和基于1的讨论是不相关的。他只是用它在给定的次数上循环。
for(int i=0;i
相当于
for(int i=1;i@ZacHowland我认为OP缺少它(在本例中,即使循环也给出了相同的结果)因为他从未使用计数器引用向量中的项目,基于0和基于1的讨论是不相关的。他只是使用它在给定次数上循环。
for(int i=0;i
相当于
for(inti=1;i@ZacHowland我认为OP缺少它(eve