2

私はstd::vector<type> myVector

コンテンツは次のとおりです。

el1, el2, el3, splitElement, el4,el5

私は分割splitElementsplit1split2 いて、ベクトルが必要です:

split2, el4, el5, el1, el2, el3, split1

Split2 を開始し、split1 を終了する必要があります。他の要素の順序は、例のようにする必要があります。ベクトルをチェーンとして扱いましょう。2 つの要素とシフト チェーンを挿入して、split2 の最初の要素を作成したいと考えています。stlを使用してそれを行うエレガントで効果的な方法は何ですか.

今のところ私の高速コード(非常に醜い解決策です):

std::vector<type> before;
std::vector<type> after;
bool afterBool = false;
for(std::vector<type>::iterator it = myVector.begin(); it != myVector.end(); it++)
{
     if(*it == splitElement)
     {
          afterBool = true;
          before.push_back(split1);
          after.push_back(split2);
     }
     else if(afterBool)
          after.push_back(*it);
     else
          before.push_back(*it);
}
myVector.clear();
for(std::vector<type>::iterator it = after.begin(); it != after.end(); it++)
     myVector.push_back(*it);
for(std::vector<type>::iterator it = before.begin(); it != before.end(); it++)
     myVector.push_back(*it);

コードなしでトピックを離れたくないという理由だけで追加しました。

どうしたら綺麗にできますか?

4

3 に答える 3

6

例:

std::vector<int> myvector = {1, 2, 3, 0, 4, 5};
int splitElement = 0;
int split1 = -1;
int split2 = -2;

まず、次のものを見つけますsplitElement

auto it = std::find(myvector.begin(), myvector.end(), splitElement);

次に、 std::rotateアルゴリズムsplitElementを使用して、見つけたポイントでベクトルを回転させます。

std::rotate(myvector.begin(), it, myvector.end());
// this yields { 0, 4, 5, 1, 2, 3 }

最後に、split2 を最初に割り当て、split1 を後ろにプッシュします。

myvector[0] = split2;
myvector.push_back(split1);

ベクトルは次のようになります{-2, 4, 5, 1, 2, 3, -1}

于 2012-09-12T10:37:28.693 に答える
0

ソート要件とタイプの<操作については言及していないので。要素を分割して、最初の分割をベクトルの最後の要素として、2番目の分割をベクトルの最初の要素として作成したいと思います。これを行うためのより良い方法は、データ構造(リンクリスト)を使用することです。

  • ベクトルの要素をLLに格納します
  • 分割された要素までリストをトラバースします
  • 2番目の要素をLLのヘッドとして、最初の要素をテールとして作成します
  • 元の尾は元のタルの隣を指している必要があります。

これらの上記の操作が完了した後、llをトラバースして、ベクトルに戻します。

于 2012-09-12T09:53:24.340 に答える
0

ベクトルを分割したいようです。したがってstd::partition
、分割要素として整数と -1 を使用して例を使用することができます。

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

struct Splitter
{
    int split;
    Splitter(int sp):split(sp){}
    bool operator()(int i)
    {
    return split < i;
    }
};
int main () {
  vector<int> myvector;
  vector<int>::iterator it, bound;

  // set some values:
  for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9

  bound = partition (myvector.begin(), myvector.end(), Splitter(5));

  myvector.insert(bound, -1);
  cout << "odd members:";
  for (it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;
  cout << endl;

  return 0;
}
于 2012-09-12T09:42:34.673 に答える