C++ 什么';这两个std::vector';什么是分配方法?

C++ 什么';这两个std::vector';什么是分配方法?,c++,vector,assign,C++,Vector,Assign,有两种方法(我知道)可以将一个向量分配给另一个向量: std::vector<std:string> vectorOne, vectorTwo; // fill vectorOne with strings // First assign method vectorTwo = vectorOne; // Second assign method vectorTwo.assign( vectorOne.begin(), vectorOne.end() ); std::向量向量酮,

有两种方法(我知道)可以将一个向量分配给另一个向量:

std::vector<std:string> vectorOne, vectorTwo;
// fill vectorOne with strings

// First assign method
vectorTwo = vectorOne;

// Second assign method
vectorTwo.assign( vectorOne.begin(), vectorOne.end() );
std::向量向量酮,向量二;
//用字符串填充矢量
//第一赋值法
向量two=向量酮;
//二次分配法
赋值(vectorOne.begin(),vectorOne.end());

这些方法之间真的有区别吗?或者在非常大的载体上执行时,它们在效率和安全性方面是相同的?

它们几乎是等效的。第二个原因是 您可能有需要(隐式)转换的类型:

std::vector<int> vi;
std::vector<double> vd;
//  ...
vd.assign( vi.begin(), vi.end() );
vector<int> vi;
vector<double> vd;
//  ...
vd.assign( vi.begin(), vi.end() );
std::vector vi; std::矢量vd; // ... 虚拟赋值(vi.begin(),vi.end()); 或者容器的类型可能不同:

vd.assign( std::istream_iterator<double>( file ),
           std::istream_iterator<double>() );
vd.assign(标准::istream_迭代器(文件),
std::istreamu迭代器();
如果您知道两个容器的类型相同,只需 使用赋值。它的优点是只使用一个 引用源,并可能允许在
C++11

第二种形式是泛型的,它适用于任何迭代器类型,只从源向量复制元素

第一种形式只适用于完全相同类型的
向量
,它复制元素,在C++11中,还可以通过从源向量复制分配器来替换分配器


在您的示例中,这些类型是相同的,并且使用无状态的
std::allocator
,因此没有区别。您应该使用第一种形式,因为它更简单、更容易阅读。

在这种情况下,它们是等效的。[和C++03标准]。但是,如果vectorTwo在赋值之前包含元素,则差异将被忽略。然后

vectorTwo = vectorOne; // use operator=
// Any elements held in the container before the call 
// are either assigned to or destroyed.

vectorTwo.assign() // any elements held in the container
// before the call are destroyed and replaced by newly 
// constructed elements (no assignments of elements take place).
需要
assign
,因为
operator=
采用单个右操作数,所以当需要默认参数值或值范围时,使用
assign
assign
所做的事情可以通过首先创建合适的向量,然后分配:

void f(vector<Book>& v, list<Book>& l){
    vector<Book> vt = (l.begin(), l.end());
    v = vt;
}

相等,第一个可能在任何情况下调用第二个,或者它们都调用一些公共的底层例程。或者您只想从源代码的子范围中赋值。+1,请注意,
。assign(beg,end)
要求任意类型
T
可以嵌入可构造或移动可插入(后者用于
std::vector
,特别是当迭代器类型不满足正向迭代器要求时)。对赋值运算符的要求是不同的;
T
必须是可复制插入的和可复制分配的。这在OP的情况下并不重要,但需要注意的是,它们并不总是近似相等的。在这种情况下,它们肯定是相等的。是否有任何保证
assign
在通过r时只执行一次分配andom访问迭代器?(即,我们是否保证优化)关于分配器的一点是好的:第一个复制分配器,第二个不复制。(默认分配器没有问题,但其他分配器可能有问题。)关于分配器的问题对于C++11来说并不新鲜。它从C++98开始就出现了。@JamesKanze你确定吗?C++03特别指出([lib.container.requirements]/8)构造时提供的分配器用于容器生命周期内的所有分配,并且(副本)相同的分配器由
get_allocator()返回
.C++11有类似的措辞,但添加了“或直到分配器被替换。分配器只能通过赋值或
swap()替换”(
)我认为这是标准中的一个错误修复。我不能相信委员会在这方面改变了预期的行为。我很确定这是一个非常有意的改变。
allocator\u traits::propagate\u on\u container\u move\u赋值默认为false,因此任何C++03分配器的行为都没有改变,只有新的C++11分配器在C++03中,分配程序没有协议要求在分配时替换它,因此容器无法知道替换它是安全的还是可取的,因此从未替换过分配程序。
.assign(b,e)
表单也允许分配给现有元素(至少在C++11中)