すべての通常のSTLアルゴリズムは、正確に実行したいことを満たしていないようです。
std::swap_ranges
ほぼそこにありますが、同じように長い範囲を交換する必要
std::rotate
もありますが、1つの範囲の終点が2番目の範囲の始点と等しい必要があります。
// pseudo-splice on vector
v1.insert(v1.begin() + 2 + 2, v2.begin() + 3, v2.begin() + 3 + 3);
v2.erase(v2.begin() + 3, v2.begin() + 3 + 3);
// pseudo-splice on vector
v2.insert(v2.begin() + 3, v1.begin() + 2, v1.begin() + 2 + 2);
v1.erase(v1.begin() + 2, v1.begin() + 2 + 2);
もちろん、これを2つの範囲の任意のイテレータ境界をとる関数テンプレートに簡単に抽象化できます。
デビッドのコメントに基づいて編集し、不必要なサイズ変更を避けるためにいくつかの最適化を行うことができます
// compute smallest range here, in this case it's the v1 part
std::swap_ranges(v1.begin() + 2, v1.begin() + 2 + 2, v2.begin() + 3);
// now handle the remaining part of the longest range, in this case it's element v2 + 3 + 2
std::insert(v1.begin() + 2 + 2, v2.begin() + 3 + 2);
std::erase(v2.begin() + 3 + 2);
更新:それstd::list
以来使用した方が簡単です(以下のコードを模倣するために/部分splice
を再配置しました)insert
erase
v1.splice(v1.begin() + 2 + 2, v2, v2.begin() + 3, v2.begin() + 3 + 3);
v2.splice(v2.begin() + 3, v1, v1.begin() + 2, v1.begin() + 2 + 2);