从向量中删除元素并将该元素添加到新的向量c ++中

时间:2015-12-09 19:44:03

标签: c++ vector

我有std::vector<int> numList,其中包含{9,6,3,3,2,1}。我想要的是,在循环过程中,一旦我们点击9 % 3 == 0,我想将9放入新的向量v13v2,而从原始列表中删除这些数字。每次mod导致0时重复此过程。

我有这个,但它崩溃了:

for(i = 0; i < listSize; i++)
{
    for(j = 0; j < listSize; j++)
    {
        if(i != j)
        {
            remainder = numList[i] % numList[j];

            if(numList[i] % numList[j] == 0)
            {
                //cout<< numList[i] << " " << numList[j]<<endl;
                v1.push_back(numList[i]);
                v2.push_back(numList[j]);

                numList.erase(numList.begin() + i);
                numList.erase(numList.begin() + j);
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您必须放弃listSize并使用numList.size(),这将为您提供当前尺寸。您可以删除整个remainder = numList[i] % numList[j];,同时我们也可以删除它。我猜你以后没有使用remainder,完全删除它。

重要:

  1. 应首先删除较大索引的元素,然后删除较小的元素。
  2. 您不应在发生删除的周期中增加ij - 您不想跳过任何元素。
  3. 在与任何东西配对的元素中有1。修复条件。
  4. 总而言之,不酷

    int i; // just absurd
    // list of variable declarations that are not needed right now, or not needed at all
    
    for(i = 0; i < listSize; i++)
    

    这要好得多:

    for(int i = 0; i < numList.size(); i++)
    

答案 1 :(得分:0)

我认为您需要以下内容

#include <iostream>
#include <iterator>
#include <vector>

int main()
{
    std::vector<int> v = { 9, 6, 3, 3, 2, 1 };
    std::vector<int> v1;
    std::vector<int> v2;

    for ( std::vector<int>::size_type i = 0; i < v.size(); )
    {
        std::vector<int>::size_type j = i + 1;
        while ( j < v.size() && v[i] % v[j] ) j++;
        if ( j != v.size() )
        {
            v1.push_back( v[i] );
            v2.push_back( v[j] );
            v.erase( std::next( v.begin(), j ) );    
            v.erase( std::next( v.begin(), i ) );    
        }
        else
        {
            i++;
        }
    }

    for ( int x : v1 ) std::cout << x << ' ';
    std::cout << std::endl;

    for ( int x : v2 ) std::cout << x << ' ';
    std::cout << std::endl;
}

程序输出

9 6 2 
3 3 1 

考虑到内循环中的索引不能小于外循环中用于匹配元素的索引。