这两个std :: vector赋值方法有什么区别?

时间:2013-08-28 15:55:20

标签: 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() );

这些方法确实存在差异,或者在非常大的载体上进行效率和安全性方面是否相同?

3 个答案:

答案 0 :(得分:6)

他们几乎相同。第二个原因是 你可能有需要(隐式)转换的类型:

std::vector<int> vi;
std::vector<double> vd;
//  ...
vd.assign( vi.begin(), vi.end() );

或者容器的类型可能不同:

vd.assign( std::istream_iterator<double>( file ),
           std::istream_iterator<double>() );

如果你知道两个容器的类型相同,那就是 使用任务。它的优点是只使用一个 引用源,并可能允许移动语义 C ++ 11。

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:1)

在这种情况下它们是等效的。 [和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=采用单个右侧操作数,因此在需要默认参数值或值范围时使用assignassign可以通过首先创建合适的向量然后分配它来间接完成:

void f(vector<Book>& v, list<Book>& l){
    vector<Book> vt = (l.begin(), l.end());
    v = vt;
}
然而,这可能既丑陋又效率低下(例子来自Bjarne Stroustrup“The C ++ ......”)

另请注意,如果vector不是同一类型,那么还需要允许隐式转换的assign

vector<int> vi;
vector<double> vd;
//  ...
vd.assign( vi.begin(), vi.end() );