关于c ++中的向量地址

时间:2013-04-23 10:05:14

标签: c++ vector stl memory-address

在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);
         }

我的问题是,如果我们在temp中放入一些字符串大约1000次,那么这些temp会分享地址吗?比如当i = 500时,新的temp将使用我在i = 1时创建的第一个临时地址的地址?或者虽然 vector(string)使用与temp相同的名称,但地址总是不同。

因为我想制作类似2D动态数组的东西,所以我想到

           vector<vector<string> > input;

,我需要的是每个字符串类型的矢量temp应该安全地保持输入。

以外有什么黄油的想法
              vector<vector<string> > input;

4 个答案:

答案 0 :(得分:4)

您的代码泄漏;当你写作

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

你在堆上分配一个空的vector<string>,然后在temp复制它。每次进行此循环时,都会泄漏一个向量(一个空的,所以可能只有几个字节)。

根本不需要这种分配,你可以写一下:

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就像新添加的向量的临时“昵称”一样。

答案 1 :(得分:0)

在这种情况下,每次在向量中向后推送时,都会有字符串的副本。如果你不想复制你的变量 - 例如你可以使用指针(这对于std :: string来说不常见,但是你可以使用一些std :: ref魔法,但这又是另一个讨论)< / p>

答案 2 :(得分:0)

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

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

由于您可能希望将该矢量的副本存储在整个数据持有者input中(类型为vector<vector<string>>

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

但是,您应该围绕a移动线条,但要确保只有一个整体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只包含一个有效元素。

答案 3 :(得分:0)

当你正在创建一个新的向量temp = * new vector; &安培;那么你试着在这个向量中推回。 &安培;为了改进,请阅读@ 6502的答案。

正如您所想的那样,如果您多次放置一些字符串,那么它将共享相同的地址。

答案是“不”。 因为随着矢量大小的增加或新成员即将被推回&amp;向量的大小无法添加新数据,然后在内部调整大小。该过程以1->完成。为新输入腾出空间(新的大小取决于内部算法,该算法决定新的大小,你可以假设当前大小的两倍)。然后整个矢量条目在新区域和新区域中被覆盖。然后推回新数据。

因此新区域的分配将导致临时地址的更改。

有关详细信息,请参阅How does c++ std::vector work?