在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;
答案 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?