【发布时间】:2014-02-15 19:49:32
【问题描述】:
我正在尝试复制一个字符串向量并将其附加到其原始向量的末尾,即复制其内容。示例:
Input : vector<string> s = {"abc", "def"}
Output: vector<string> s = {"abc", "def", "abc", "def"}
我使用的是插入方法,即
s.insert(s.end(), s.begin(), s.end());
但是,这显示了依赖于编译器的结果。在,LLVM 铿锵声中,它给了我预期的答案。
有了 GCC,它给了我
Output: vector<string> s = {"abc", "def", "", ""}
我想知道为什么会发生这种情况以及实现此向量复制目标的最安全方法是什么?
这是上述程序的 ideone.com 链接:http://ideone.com/40CH8q
【问题讨论】:
-
如果迭代器无效,它看起来像 UB。致电
reserve以保证不会失效。 -
您使用的是哪个版本的 g++?使用 g++ 4.8.1,我得到了正确的输出。
-
我使用的是相同的 g++4.8.1。我附上了在线编译器的链接以显示问题。
-
@KerrekSB 这真的是保证吗?我认为任何插入或删除都会使迭代器无效(这意味着不能保证它们仍然有效,尽管它们可以是)
-
@Ali:有趣;我看不到任何明显的UB。您正在利用向量的存储是连续的这一事实......
标签: c++ gcc iterator clang llvm