int main()
{
using namespace std;
int n = 5,input;
vector<int> N(n);
vector<int> S;
for(int i=0;i<n;i++)
{
cin>>input;
N.push_back(input);
}
cin>>Q;
for(auto const& value: N)
{
if(value<Q)
{
S.push_back(value);
N.erase(remove(N.begin(), N.end(), value), N.end());
}
}
...
此代码首先将用户输入的值推送到N向量,然后在for循环内,如果N向量中的元素值小于Q,则将该元素推入空向量S并删除该元素来自矢量N. 例如:
N vector : 21 9 5 8 10
Q = 10
现在在第一次迭代之后:
N vector : 21 10
S vector : 0 9 8 9 5 8
但预期的S矢量是:
S vector : 9 5 8
为什么我会得到意想不到的S矢量值?
答案 0 :(得分:3)
如果您的目标是从满足特定条件的向量中移除项目,并将这些已移除的项目添加到另一个向量,则使用STL算法函数将完成工作而不是编写循环:
#include <algorithm>
#include <vector>
#include <iterator>
int main()
{
std::vector<int> N = { 32, 10, 22, 100, 210, 1};
std::vector<int> S;
int Q = 100;
// partition the items
auto it = std::stable_partition(N.begin(), N.end(), [&](int n) { return n < Q;});
// copy items from left partition to the vector
std::copy(N.begin(), it, std::back_inserter(S));
// erase items in left partition
N.erase(N.begin(), it);
}
整个想法是使用分区算法。在这种情况下,我使用std::stable_partition返回一个划分分区矢量的迭代器。
分区点由谓词(n < Q
)决定。分区左侧的任何内容都满足n < Q
,否则值将放在分区的右侧。