矢量分裂/移位元素

时间:2012-09-12 09:28:53

标签: c++ stl vector refactoring

std::vector<type> myVector

让我们说内容是:

el1, el2, el3, splitElement, el4,el5

我将splitElement分为split1split2 我想要矢量:

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

Split2应该是开始,split1结束。其他元素顺序应该与示例相同。让我们将矢量视为链。我想插入两个元素和shift链来制作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);

我添加它只是因为我不想在没有任何代码的情况下离开主题。

如何以不错的方式做到这一点?

3 个答案:

答案 0 :(得分: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指定给beggining并将split1推送到后面:

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

现在,矢量看起来像这样:{-2, 4, 5, 1, 2, 3, -1}

答案 1 :(得分: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;
}

答案 2 :(得分:0)

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

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

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