2013-04-23 86 views
1
在C

++关于向量在C++地址

像我有

 vector<vector<string> > input; 
     for(int i=0;i<=1000;i++){ 

      vector<string> temp; 
      temp.pushback(everytime change the input value); 
         . 
         . 
         .just continues push some string in temp 
         . 
         . 
      temp.pushback(everytime change the input value); 
      input.pushback(temp); 
     } 

我的问题是,如果我们把一些字符串在温度为大约1000倍,将这些临时份额的地址?比如当我= 500时,新的temp将使用我在i = 1时创建的第一个临时地址的地址?或虽然矢量(字符串)使用像temp一样的名称,但地址将始终不同。

因为我想拍的东西像一个二维动态数组,所以我想

  vector<vector<string> > input; 

,和我需要的是每一个串型矢量温度应妥善保存输入。 难道还有比

   vector<vector<string> > input; 
+1

我感觉*“Java-C++”*? – 2013-04-23 10:39:46

+0

'string temp = * new string;'也会**内存泄漏**。停止这样做,只需使用'string temp =“aaaaaaa”;'! – 2013-04-23 10:43:21

回答

4

您的代码泄漏;当你写

vector<string> temp = *new vector<string>; 

您是在堆上分配tempvector<string>,然后复制它。每次你做这个循环时,你都会泄漏一个矢量(一个空的,所以可能只是几个字节)。

并不需要在所有这配置,你可以只写来代替:

vector<string> temp; 

而且要创建一个临时的载体,加油吧,并与另一个向量中的推动它。更好的方法可能是改为:

input.resize(1 + input.size());  // make room for a new vector 
    vector<string>& temp = input.back(); // call it temp in the following 
    ... 
    temp.push_back(...); 

这种方式,你已经分配新的载体内input,并直接将元素添加到它...temp仅用作新添加的矢量的临时“昵称”。

+0

谢谢你的回答,因为我想创建类似于2D动态数组的东西,而且temp的数量是不同的,我不知道它会有多少,它可以是500或1000或更多,这实际上是我<我不知道的。并在下面的代码中,我需要跟踪每个输入的温度的日期,请您告诉我一些建议? – Rebecca 2013-04-23 10:29:41

0

其他任何黄油想法在这种情况下,每次推回它在你的矢量时间,你将有你的字符串的副本。如果你不想复制你的变量 - 例如你可以使用指针(这对于std :: string来说并不常见,但你可以使用一些std :: ref魔术,但这又是一次讨论)

0

它不会那样工作。该解决方案可能会更容易,只需使用:

vector<string> temp; // no new ... 

因为你很可能想在矢量存储副本的全面数据持有者inputvector<vector<string>>

这可能不是最有效的解决方案,但它应该可靠地工作,每个实例都将是独立于其他实例的

你应该,但是,移动线周围,但是,以确保您只有一个整体input:。

vector< vector<string> > input; // move this line *before* the loop! 
for(int i=0;i<=1000;i++){ 
     vector<string> temp; 
     temp.pushback(everytime change the input value); 
        . 
        . 
        .just continues push some string in temp 
        . 
        . 
     temp.pushback(everytime change the input value); 
     input.pushback(temp); 
} 

否则,您将在每个循环中创建一个新的input并丢弃以前的条目。也许这是造成混乱,因为你的input只包含一个有效元素。

+0

感谢您的回答!那么最有效的方法是什么?导致temp.size可能因不同的情况而有所不同,我需要在以下代码中跟踪输入向量中的数据; – Rebecca 2013-04-23 10:19:45

+0

使用C++ 11,它可能是'input.pushback(std :: move(temp));',用C++ 03:'input.pushback(vector ()); input.back()。swap(temp);' – 2013-04-23 10:26:19

0

当你创建一个新的矢量temp = * new vector; &然后你尝试推回这个向量。用于改进的&阅读@ 6502的答案。

而你正在想,如果你多次放置一些字符串,那么它会共享相同的地址。

答案将是“否”。 因为随着矢量大小的增加或新成员即将推回&矢量大小无法添加新数据,所以它在内部调整它的大小&这个过程完成为1->为新输入创建空间(新大小取决于决定什么样的新大小的内部算法,您可以假设为当前大小的两倍)。那么整个矢量条目在新区域&被复制,然后新数据被推回。

所以新区域的分配会导致临时地址的变化。

更多信息请参考How does c++ std::vector work?

+0

感谢您的回复!怎么样char a ='t';如果流通100次或更多次,那么a是否会有重复地址? – Rebecca 2013-04-23 10:36:42