1

在 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 时,新的临时地址将使用我在 i=1 时创建的第一个临时地址的地址?或者尽管向量(字符串)使用与 temp 相同的名称,但地址总是不同的。

因为我想做一个二维动态数组,所以我想

           vector<vector<string> > input;

,我需要的是每个字符串类型的向量 temp 应该安全地保留输入。除了黄油还有什么想法吗

              vector<vector<string> > input;
4

4 回答 4

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

于 2013-04-23T10:19:08.423 回答
0

在这种情况下,每次将其推回向量中时,您都会获得字符串的副本。如果您不想复制变量 - 例如,您可以使用指针(这不是 std::string 的常见做法,但您可以使用一些 std::ref 魔法,但同样,这是另一个讨论)

于 2013-04-23T10:08:22.670 回答
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只包含一个有效元素。

于 2013-04-23T10:08:37.233 回答
0

当您创建一个新向量 temp= *new vector; & 然后你尝试在这个向量中推回。& 为了改进,请阅读@6502 的答案。

正如您所想的那样,如果您多次输入某个字符串,那么它将共享相同的地址。

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

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

有关更多信息,请参阅c++ std::vector 如何工作?

于 2013-04-23T10:30:55.627 回答