vector& operator=(const vector& x); // (1) C++03
constexpr vector& operator=(const vector& x); // (1) C++20
vector& operator=(vector&& x); // (2) C++11
vector& operator=(vector&& x) noexcept(
allocator_traits<Allocator>::propagate_on_container_move_assignment::value
|| allocator_traits<Allocator>::is_always_equal::value); // (2) C++17
constexpr vector& operator=(vector&& x) noexcept(
allocator_traits<Allocator>::propagate_on_container_move_assignment::value
|| allocator_traits<Allocator>::is_always_equal::value); // (2) C++20
vector& operator=(initializer_list<T> init); // (3) C++11
constexpr vector& operator=(initializer_list<T> init); // (3) C++20
概要
- (1) : コピー代入
- (2) : ムーブ代入
- (3) : 初期化子リストの代入
テンプレートパラメータ制約
- (1), (3) : 型
T
がvector
に対してコピー挿入可能であること
効果
- (1) : 同じテンプレートパラメータを持つ
vector
クラスのオブジェクトをコピー代入する。*this
の全ての要素が解放され、x
の全ての要素が*this
にコピーされる。 - (2) : 同じテンプレートパラメータを持つ
vector
クラスのオブジェクトをムーブ代入する。*this
の全ての要素が解放され、x
の全ての要素が*this
にムーブされる。 - (3) : 同じテンプレートパラメータを持つ
initializer_list
クラスのオブジェクトをコピー代入する。*this
の全ての要素が解放され、init
の全ての要素が*this
にコピーされる。
戻り値
*this
事後条件
- (1) :
*this == x
- (2) :
*this
は元々のx
と等値となる - (3) :
*this == vector{init}
計算量
- (1) : 全要素のデストラクタ呼び出しとコピーを行うために、線形時間
- (2) : 全要素のデストラクタ呼び出しをするために、線形時間
- (3) : 全要素のデストラクタ呼び出しとコピーを行うために、線形時間
例
#include <cassert>
#include <vector>
#include <algorithm>
#include <utility>
int main()
{
// コピー代入
{
std::vector<int> v1 = {1, 2, 3};
std::vector<int> v2;
v2 = v1;
assert(v1 == v2);
}
// ムーブ代入
{
std::vector<int> v1 = {1, 2, 3};
std::vector<int> v2;
std::vector<int> copied_v1 = v1;
v2 = std::move(v1);
assert(copied_v1 == v2);
}
// 初期化子リストからのコピー代入
{
std::vector<int> v1;
v1 = {1, 2, 3};
// 事後条件の検証:
std::initializer_list<int> init = {1, 2, 3};
std::vector<int> v2;
v2 = init;
assert(v2.size() == init.size());
assert(std::equal(v2.begin(), v2.end(), init.begin()));
}
}
出力
参照
- N2679 Initializer Lists for Standard Containers(Revision 1)
- (3)の経緯となる提案文書
- N4258 Cleaning-up noexcept in the Library, Rev 3
noexcept
追加の経緯となる提案文書
- P1004R2 Making
std::vector
constexpr