我std::vector<type> myVector
让我们说内容是:
el1, el2, el3, splitElement, el4,el5
我将splitElement
分为split1
和split2
我想要矢量:
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);
我添加它只是因为我不想在没有任何代码的情况下离开主题。
如何以不错的方式做到这一点?
答案 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并存储回向量。