空整数向量中的push_back是否填充了意外值?

时间:2017-05-21 07:51:19

标签: c++ vector stl

    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矢量值?

1 个答案:

答案 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);
}

Live Example

整个想法是使用分区算法。在这种情况下,我使用std::stable_partition返回一个划分分区矢量的迭代器。

分区点由谓词(n < Q)决定。分区左侧的任何内容都满足n < Q,否则值将放在分区的右侧。