std::
map::operator=
公众成员函数 <map>
C++98 |
copy (1) |
map& operator= (const map& x); |
C++11 |
copy (1) |
map& operator= (const map& x); |
|
move (2) |
map& operator= (map&& x); |
|
initializer list (3) |
map& operator= (initializer_list<value_type> il); |
复制容器的内容
将新内容分配给容器,替换其当前内容。
-
C++98:
-
将x中的所有元素复制到容器中,并相应地改变其大小.
容器保留其当前的分配器,该分配器用于在需要时分配额外的存储空间。
-
C++11:
-
复制赋值(1)将x的所有元素复制到容器中(x保留其内容)。
移动赋值(2)将x的元素移动到容器中(x处于未指定但有效的状态).
初始化列表赋值(3)将il的元素复制到容器中。
新的容器大小与调用之前x(或il)的大小相同。
容器保留了它当前的分配器,除非分配器特性表明x的分配器应该传递。
这个分配器(通过它的特性)用于在存储需求发生变化时进行分配或释放,以及在需要时构造或销毁元素。
在调用之前保存在容器中的任何元素要么被赋值,要么被销毁。
☲ 参数
-
x
-
一个相同类型的映射对象(即,具有相同的模板参数,key, T, Compare和Alloc)。
-
il
-
一个初始化列表对象。编译器将自动从初始化列表声明符构造此类对象。
成员类型value_type是容器中元素的类型,在map中定义为<const key_type, mapped_type>的别名
(参见map成员类型)。
☉ 返回值
*this
☣ 示例
// assignment operator with maps
#include <iostream>
#include <map>
int main ()
{
std::map<char,int> first;
std::map<char,int> second;
first['x']=8;
first['y']=16;
first['z']=32;
second=first; // second now contains 3 ints
first=std::map<char,int>(); // and first is now empty
std::cout << "Size of first: " << first.size() << '\n';
std::cout << "Size of second: " << second.size() << '\n';
return 0;
} |
输出:
Size of first: 0
Size of second: 3
✥ 复杂度
对于复制赋值(1):线性大小(销毁,复制)。
对于移动赋值(2):与当前容器大小(销毁)成线性。*
对于初始化器列表赋值(3):对于
size最大为对数(销毁,移动赋值)——如果
il已经排序,则为线性。。
*如果分配器没有
propagate,则会增加分配的复杂性。
☣ 迭代器的有效性
与此容器相关的所有迭代器、引用和指针都会失效。
在移动赋值操作中,指向x中元素的迭代器、指针和引用也会失效。
⇄ 数据竞争
访问所有复制的元素。
move赋值(2)修改x。
容器及其所有元素都被修改。
☂ 异常安全性
基本保证:如果抛出异常,则容器处于有效状态。
如果
allocator_traits::construct不支持元素构造的适当参数,
或者
value_type不是
copy assignable(或
move assignable for(2)),它将导致未定义的行为。
🍄 另请参阅
map::map |
构建map对象(公众成员函数) |
map::insert |
插入元素(公众成员函数) |
map::operator[] |
访问元素(公众成员函数) |