2

我有std::vector<type> myVector

可以说内容是:

el1, el2, el3, splitElement, el4,el5

我正在分裂,splitElement我 想要向量:split1split2

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

Split2 应该开始,split1 结束。其他元素顺序应如示例中所示。让我们将向量视为链。我想插入两个元素并移位链以使 split2 第一个元素。使用 stl.js 的优雅而有效的方法是什么?

我现在的快速代码(这是非常丑陋的解决方案):

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);

splitElement然后使用std::rotate算法在找到的点旋转向量:

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

听起来您想对向量进行分区。因此,您可以使用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 回答
0

由于您没有提到类型的排序要求和 < 操作。我想你只是想拆分元素并将第一个拆分作为向量中的最后一个元素,将第二个拆分作为向量的第一个元素我想更好的方法是使用数据结构(链接列表)

  • 将向量的元素存储在 LL 中
  • 遍历列表直到拆分元素
  • 将第二个元素作为头部,将第一个元素作为 LL 的尾部
  • 原来的尾巴应该指向原来的tal旁边。

在完成上述这些操作之后。只需遍历 ll 并存储回向量中。

于 2012-09-12T09:53:24.340 回答