要素を消去して後ろに再度追加するよりも良い方法(コードのシンボルが速いか少ない)はありますか?
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);
}
これは 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());
}
おそらく最速の方法は、最後の要素と交換することです
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::swap
はT
と連携する必要があります
余分な変数を避けることができます。
v.Push_back(v[itemIndex]);
v.erase(v.begin() + itemIndex);
ベクターの途中から頻繁に削除し、ランダムアクセスを必要としないようにコードを書き直すことができる場合は、リンクリスト(std::list
)代わりに。