参见英文答案 > Nice way to append a vector to itself 4个
我试图制作一个字符串向量的副本,并将其附加到其原始向量的末尾,即复制其内容.例:
Input : vector<string> s = {"abc", "def"}
Output: vector<string> s = {"abc", "def", "abc", "def"}
我正在使用插入方法,即
s.insert(s.end(), s.begin(), s.end());
但是,这表现出与编译器相关的结果.在,LLVM clang,它给了我预期的答案.
GCC给了我
Output: vector<string> s = {"abc", "def", "", ""}
我想知道为什么会发生这种情况以及实现此向量复制目标最安全的方法是什么?
以下是该程序的ideone.com链接:http://ideone.com/40CH8q
解决方法:
尽管可以使用迭代器完成,但安全的替代方法是避免它们:
size_t size = v.size(); // Of course we shouldn't access .size() in the loop...
v.reserve(size * 2); // Preallocation. Thanks @Ali for this performance hint
for (size_t i = 0; i < size; ++i)
v.push_back(v[i]);
通常,使用迭代器同时修改数据结构(不仅仅是其元素)是危险的;当迭代器失效时以及在修改后重用旧迭代器是安全的时候,你应该仔细阅读.因此,有时使用“旧”方法迭代随机访问序列是有意义的:使用索引变量.