web-dev-qa-db-ja.com

ベクトル要素をベクトルの後ろに移動する

要素を消去して後ろに再度追加するよりも良い方法(コードのシンボルが速いか少ない)はありますか?

template <typename T>
void moveItemToBack(std::vector<T>& v, size_t itemIndex)
{
   T tmp(v[itemIndex]);
   v.erase(v.begin() + itemIndex);
   v.Push_back(tmp);
}
12
Violet Giraffe

これは std::rotate 標準ライブラリから。これはベクトルサイズを変更しないため、再割り当てもトリガーされません。関数は次のようになります。

template <typename T>
void moveItemToBack(std::vector<T>& v, size_t itemIndex)
{
    auto it = v.begin() + itemIndex;
    std::rotate(it, it + 1, v.end());
}
36
Blastfurnace

おそらく最速の方法は、最後の要素と交換することです

template <typename T>
void moveItemToBack(std::vector<T>& v, size_t itemIndex)
{
   std::swap(v[itemIndex], v.back()); // or swap with *(v.end()-1)
}

1回の操作!もちろんstd::swapTと連携する必要があります

10

余分な変数を避けることができます。

v.Push_back(v[itemIndex]);
v.erase(v.begin() + itemIndex);

ベクターの途中から頻繁に削除し、ランダムアクセスを必要としないようにコードを書き直すことができる場合は、リンクリスト(std::list)代わりに。

4
Brian