C++ 向量拆分/移位元素

C++ 向量拆分/移位元素,c++,stl,vector,refactoring,C++,Stl,Vector,Refactoring,我有std::vector myVector 假设内容是: el1, el2, el3, splitElement, el4,el5 我正在将splitElement拆分为split1和split2 我想要向量: split2, el4, el5, el1, el2, el3, split1 拆分2应该是开始,拆分1应该是结束。其他元素的顺序应如示例中所示。让我们把向量看作链。我想插入两个元素并移动链以使split2成为第一个元素。 使用stl的优雅而有效的方法是什么 我现在的快速代码(这是

我有
std::vector myVector

假设内容是:

el1, el2, el3, splitElement, el4,el5
我正在将
splitElement
拆分为
split1
split2
我想要向量:

split2, el4, el5, el1, el2, el3, split1
拆分2应该是开始,拆分1应该是结束。其他元素的顺序应如示例中所示。让我们把向量看作链。我想插入两个元素并移动链以使split2成为第一个元素。 使用stl的优雅而有效的方法是什么

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

std::vector之前;
std::后向量;
bool afterBool=false;
对于(std::vector::iterator it=myVector.begin();it!=myVector.end();it++)
{
if(*it==splitElement)
{
afterBool=真;
前。推回(拆分1);
之后。向后推_(拆分2);
}
否则如果(后传)
之后。将_向后推(*it);
其他的
之前。将_向后推(*它);
}
myVector.clear();
for(std::vector::iterator it=after.begin();it!=after.end();it++)
myVector.push_back(*it);
for(std::vector::iterator it=before.begin();it!=before.end();it++)
myVector.push_back(*it);
我添加它只是因为我不想在没有任何代码的情况下离开主题


如何以一种好的方式进行呢?

听起来像是要对向量进行分区。因此,您可以使用
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;
}
#包括
#包括
#包括
使用名称空间std;
结构拆分器
{
整数分割;
Splitter(int-sp):split(sp){}
布尔运算符()(int i)
{
返回分裂对于(int i=1;i,因为您没有提到排序要求和对类型的<操作。
我猜你只想分割元素,第一次分割作为向量的最后一个元素,第二次分割作为向量的第一个元素
我想更好的方法是使用数据结构(链表)

  • 将向量的元素存储在LL中
  • 遍历列表直到拆分元素
  • 使第二个元素作为LL的头,第一个元素作为LL的尾
  • 原始尾部应指向其旁边的原始tal
完成上述操作后,只需遍历ll并存储回向量中。

示例:

std::vector<int> myvector = {1, 2, 3, 0, 4, 5};
int splitElement = 0;
int split1 = -1;
int split2 = -2;
然后,使用以下算法在找到的点旋转向量
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}

拆分一个元素意味着什么?使用一些拆分函数创建两个相同类型的元素。对于ex type is integer,当拆分函数定义为将元素减半时,元素是10,可以拆分为5和5。
std::vector after;
bool after=false;
如果这样编译,我会感到惊讶。我是对的。I've更正了它。写这段代码只是为了显示一些当前的解决方案。您只在拆分器位置添加了拆分的元素。正如我所写的向量应该被移位,所以split2应该开始,split1应该结束。@krzych:在向量的开头添加一个元素确实是一项非常简单的任务。
myvector.insert(myvector.begin(),-1)
再看看这个问题。你的输出是9 8 7 6-1 5 4 3 2 1。应该添加两个元素(因为它被拆分了),比如说-1和-2。它们应该替换5(拆分器)。输出应准确为-2 6 7 8 9 1 2 3 4-1。第二个拆分应为第一个元素,第一个为最后一个元素。但元素顺序应与我的示例中的相同。让我们将其视为链。目标是插入两个元素并移动向量。
std::rotate(myvector.begin(), it, myvector.end());
// this yields { 0, 4, 5, 1, 2, 3 }
myvector[0] = split2;
myvector.push_back(split1);