コンテナ内の要素を任意の位置で左または右にシフトしたい。シフト要素は連続していません。
たとえば、ベクトル {1,2,3,4,5,6,7,8} があり、{4,5,7} を 2 つの位置で左にシフトしたい場合、期待される結果は {1,4 になります。 ,5,2,7,3,6,8}
それを解決するエレガントな方法はありますか?
コンテナ内の要素を任意の位置で左または右にシフトしたい。シフト要素は連続していません。
たとえば、ベクトル {1,2,3,4,5,6,7,8} があり、{4,5,7} を 2 つの位置で左にシフトしたい場合、期待される結果は {1,4 になります。 ,5,2,7,3,6,8}
それを解決するエレガントな方法はありますか?
独自のシフト関数を作成できます。ここに簡単なものがあります:
#include <iterator>
#include <algorithm>
template <typename Container, typename ValueType, typename Distance>
void shift(Container &c, const ValueType &value, Distance shifting)
{
typedef typename Container::iterator Iter;
// Here I assumed that you shift elements denoted by their values;
// if you have their indexes, you can use advance
Iter it = find(c.begin(), c.end(), value);
Iter tmp = it;
advance(it, shifting);
c.erase(tmp);
c.insert(it, 1, value);
}
その後、次のように使用できます。
vector<int> v;
// fill vector to, say, {1,2,3,4,5}
shift(v, 4, -2); // v = {1,4,2,3,5}
shift(v, 3, 1); // v = {1,4,2,5,3}
find
複数の要素をシフトすると、コンテナの先頭で何度も反復されるため、これは単純な実装です。さらに、すべての要素が一意であると想定していますが、そうではない場合もあります。ただし、必要なものを実装する方法についてのヒントが得られたことを願っています。
簡単に挿入してから消去することはできませんか?
削除ポイントまたは挿入ポイントのいずれか低い方の上にある要素を参照する反復子を無効にすることを忘れないでください。
HTH
乾杯、
ロブ