这个问题使我不确定将一个向量附加到自身.所以问题是:遵循代码行做我所期望的,但它是否符合标准?
vec.reserve(vec.size() * 2):
vec.insert(vec.end(), vec.begin(), vec.end());
Run Code Online (Sandbox Code Playgroud)
以下(不reserve())仍然有效,是否符合标准?
vec.insert(vec.end(), vec.begin(), vec.end());
Run Code Online (Sandbox Code Playgroud)
还是实施依赖?
我想知道更有经验的人是否能够澄清这是否是对矢量进行的错误操作:
std::vector<int> v{1, 2, 3, 4, 5};
v.insert(v.begin() + 1, v[0]);
Run Code Online (Sandbox Code Playgroud)
我问的原因是因为要插入的元素是对向量中第0个元素的引用.如果插入强制向量调整大小(因为其容量已满),则引用v[0]将无效,并且代码可能会插入不正确的值.这里有一些伪代码可能会证明:
template <typename T>
void vector_insert_method(Iterator pos, const T& value) {
if capacity full:
reallocate array and copy over element
// if value was reference to elem in this vector,
// that reference might be invalidated
insert element
++size
}
Run Code Online (Sandbox Code Playgroud)
在并发系统上,此问题可能更为现实.
如果您尝试插入在您尝试插入的位置之后的元素,会发生类似且相关的问题.例如,执行类似v.insert(v.begin(), v[2])因为标准指出插入点之后对元素的引用无效.这保证有效吗?
受这个问题的启发,询问如何将一个向量附加到自身,我的第一个想法是以下(是的,我意识到insert现在是一个更好的选择):
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
int main() {
std::vector<int> vec {1, 2, 3};
std::copy (std::begin (vec), std::end (vec), std::back_inserter (vec));
for (const auto &v : vec)
std::cout << v << ' ';
}
Run Code Online (Sandbox Code Playgroud)
但是,这打印:
1 2 3 1 * 3
Run Code Online (Sandbox Code Playgroud)
每次运行程序时*都是不同的数字.只有2被替换的事实是特殊的,如果真的有解释,我会有兴趣听到它.继续,如果我附加到不同的向量(原始副本),它会正确输出.如果我在前一行之前添加以下行,它也会正确输出copy:
vec.reserve (2 * vec.size());
Run Code Online (Sandbox Code Playgroud)
std::back_inserter尽管事先没有预留内存,但我认为这是一种将元素添加到容器末端的安全方法.如果我的理解是正确的,复制线有什么问题?
我假设它与编译器无关,但我使用的是GCC 4.7.1.
为什么_n版本的copy,fill并且generate已经在C++ 11中提供了,为什么只有这些算法呢?
我正在尝试制作一个字符串向量的副本,并将其附加到其原始向量的末尾,即复制其内容.例:
Input : vector<string> s = {"abc", "def"}
Output: vector<string> s = {"abc", "def", "abc", "def"}
Run Code Online (Sandbox Code Playgroud)
我正在使用插入方法,即
s.insert(s.end(), s.begin(), s.end());
Run Code Online (Sandbox Code Playgroud)
但是,这表现出与编译器相关的结果.在,LLVM clang,它给了我预期的答案.
GCC给了我
Output: vector<string> s = {"abc", "def", "", ""}
Run Code Online (Sandbox Code Playgroud)
我想知道为什么会发生这种情况以及实现此向量复制目标最安全的方法是什么?
以下是该程序的ideone.com链接:http://ideone.com/40CH8q