您的位置:首页 > 编程语言 > C语言/C++

C++11新特性——容器相关(二)swap

2016-12-01 08:46 197 查看
swap

        新标准中提供了非成员版本的swap操作,此操作对array容器,会交换元素的值;对其他容器,则只交换容器的内部结构,并不进行元素值的拷贝操作,所以在这种情况下是非常迅速的。正因如此,当swap
array后,原来array上的迭代器还依然指向原有元素,只是元素的值变了;而swap非array容器之后,原来容器上的迭代器将指向对方容器上的元素,而指向的元素的值却保持不变。

        swap操作交换两个相同类型容器的内容。调用swap之后,两个容器中的元素将会交换:

        vector<string> svec1(10);// 10个元素的vector

        vector<string> svec2(24);// 24个元素的vector

        swap (svec1, svec2);

        调用swap后,svec1将包含24个string元素,svec2将包含10个string。除array外,交换两个容器内容的操作保证会很快——元素本身并未交换,swap只是交换了两个容器的内部数据结构。除array外,swap不对任何元素进行拷贝、删除或插入操作,因此可以保证在常数时间内完成。

        元素不会被移动的事实意味着,除string外,指向容器的迭代器、引用和指针在swap操作之后都不会失效。它们仍指向swap操作之前所指向的那些元素。但是,在swap之后,这些元素已经属于不同的容器了。例如,假定iter在swap之前指向svec1[3]的string,那么在swap之后它指向svec2
[3]的元素。与其他容器不同,对一个string调用swap会导致迭代器、引用和指针失效。

        与其他容器不同,swap两个array会真正交换它们的元素。因此,交换两个array所需的时问与array中元素的数目成正比。因此,对于array,在swap操作之后,指针、引用和迭代器所绑定的元素保持不变,但元素值已经与另一个array中对应元素的值进行了交换。

        在新标准库中,容器既提供成员函数版本的swap,也提供非成员版本的swap。而早期标准库版本只提供成员函数版本的swap。非成员版本的swap在泛型编程中是非常重要的。统一使用非成员版本的swap是一个好习惯。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: