ras*_*mus 21 c++ stl vector c++11
使用push_back时std::vector,我可以推送向量本身的元素,而不必担心因重新分配而使参数无效:
std::vector<std::string> v = { "a", "b" };
v.push_back(v[0]); // This is ok even if v.capacity() == 2 before this call.
Run Code Online (Sandbox Code Playgroud)
但是,在使用时emplace_back,std::vector将参数转发给构造函数,std::string以便复制构造在向量中发生.这使我怀疑向量的重新分配在新字符串被复制构造之前发生(否则它不会被分配到位),从而在使用之前使参数无效.
这是否意味着我无法添加向量本身的元素emplace_back,或者在重新分配的情况下是否有某种保证,类似于push_back?
在代码中:
std::vector<std::string> v = { "a", "b" };
v.emplace_back(v[0]); // Is this valid, even if v.capacity() == 2 before this call?
Run Code Online (Sandbox Code Playgroud)
eca*_*mur 19
emplace_back出于同样的原因push_back需要保证安全 ; 只有在修改方法调用返回后,指针和引用的失效才有效.
实际上,这意味着emplace_back执行重新分配需要按以下顺序进行(忽略错误处理):
在这个reddit线程中, STL确认VC11无法v.emplace_back(v[0])作为bug 支持,所以你一定要检查你的库是否支持这种用法而不是理所当然.
请注意,自我插入的某些形式被具体由标准禁止的; 例如在[sequence.reqmts]第4段中,表100 a.insert(p,i,j)具有先决条件" i并且j不是迭代器a ".