[英]Assign part of a vector to itself using std::vector::assign()
假設我有一個大小為 10 的向量(v1)。現在我只想保留部分元素,使用:
v1.assign(v1.begin() + 2, v1.begin() + 6);
我不確定的是,原始元素是否會在賦值之前被銷毀。 如果他們先被銷毀,那么我不能依賴原始數據。
此頁面似乎表明先刪除元素。 然而,一個快速的實驗告訴我數據被正確地分配給它自己。
那么將向量的一部分分配給自身時會發生什么?
根據 C++14 標准表 100 — 序列容器要求(除了容器)
表達式a.assign(i,j)
有一個前提條件,即i
和j
不是 a 的迭代器。 由於
v1.assign(v1.begin() + 2, v1.begin() + 6);
使用迭代器作為v1
迭代器,因此您違反了該前提條件
如果要重置向量以包含子范圍,則可以將這些元素復制到臨時向量中,然后將該臨時向量分配回主向量。 這應該是一個移動操作(C++11 及更高版本),因此不會制作額外的副本。
v = std::vector<decltype(v)::value_type>(v.begin() + 2, v.begin() + 6);
正如Benjamin Lindley和Barry在評論中指出的,我們可以使用std::copy
並移動迭代器,例如
std::copy(std::make_move_iterator(v.begin() + 2), std::make_move_iterator(v.begin() + 6),
std::make_move_iterator(v.begin()));
來自 C++11 標准:
23.3.6.2 向量構造函數、復制和賦值
template <class InputIterator> void assign(InputIterator first, InputIterator last);
11 效果:
erase(begin(), end()); insert(begin(), first, last);
換句話說,不要使用:
v1.assign(v1.begin() + 2, v1.begin() + 6);
到調用insert
, first
將是一個無效的迭代器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.