我有std::vector<int> numList
,其中包含{9,6,3,3,2,1}
。我想要的是,在循环过程中,一旦我们点击9 % 3 == 0
,我想将9
放入新的向量v1
和3
到v2
,而从原始列表中删除这些数字。每次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);
}
}
}
}
答案 0 :(得分:1)
您必须放弃listSize
并使用numList.size()
,这将为您提供当前尺寸。您可以删除整个remainder = numList[i] % numList[j];
,同时我们也可以删除它。我猜你以后没有使用remainder
,完全删除它。
重要:强>
i
和j
- 您不想跳过任何元素。1
。修复条件。总而言之,不酷:
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
考虑到内循环中的索引不能小于外循环中用于匹配元素的索引。