簡體   English   中英

使用 std::vector::assign() 將向量的一部分分配給自身

[英]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)有一個前提條件,即ij不是 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 LindleyBarry在評論中指出的,我們可以使用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);

到調用insertfirst將是一個無效的迭代器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM