Вектор подмножеств

У меня есть следующая программа. Как мне использовать итератор в main, чтобы показать подмножества с суммой 0?
Моя программа должна напечатать:
2 -2
5 -5

# include < iostream >
# include < vector >

using namespace std;

vector < vector < int > > test(vector <int> data)
{
vector <int> a;
vector < vector < int > > ret;
vector <int> :: iterator it1;
vector <int> :: iterator it2;
int i=0;
for(it1 = data.begin(); it1!= data.end(); it1++,i++)
{
for(it2 = data.begin() + i; it2!= data.end(); it2++ )
{
if( *it1 + *it2 == 0)
{
cout<<*it1<<" "<<*it2<<"\n";
a.push_back(*it1);
a.push_back(*it2);
ret.push_back(a);
a.clear();
}
}
}
return ret;
}
int main()
{
vector < int > data;
data.push_back(2);
data.push_back(5);
data.push_back(-3);
data.push_back(-2);
data.push_back(-5);
vector <vector <int > > v=test(data);
//how to continue printing the subsets

}

0

Решение

добавленной

#include <iostream>
#include <vector>

using namespace std;

vector < vector < int > > test(vector <int> data)
{
vector <int> a;
vector < vector < int > > ret;
vector <int> :: iterator it1;
vector <int> :: iterator it2;
int i=0;
for(it1 = data.begin(); it1!= data.end(); it1++,i++)
{
for(it2 = data.begin() + i; it2!= data.end(); it2++ )
{
if( *it1 + *it2 == 0)
{
cout<<*it1<<" "<<*it2<<"\n";
a.push_back(*it1);
a.push_back(*it2);
ret.push_back(a);
a.clear();
}
}
}
return ret;
}
int main()
{
vector < int > data;
data.push_back(2);
data.push_back(5);
data.push_back(-3);
data.push_back(-2);
data.push_back(-5);
vector <vector <int > > v=test(data);
//how to continue printing the subsets

// here is how:
for (vector <vector <int > >::iterator it = v.begin(); it != v.end(); ++it) {
vector<int> v = *it;
for (vector<int>::iterator it2 = v.begin(); it2 != v.end(); ++it2) {
cout << *it2 << " ";
}
cout << endl;
}
}
0

Другие решения

std::vector<std::vector<int> >::iterator it=v.begin(), end=v.end();
for ( it!= end, ++it) {
std::copy(it->begin(),it->end(),std::ostream_iterator<int>(std::cout, " "));
}

Или с помощью C ++ 11

 for(const auto& i:v)
{
for(const auto& j:i)
std::cout<<j<< " ";
std::cout<<std::endl;
}
1

Примерно в псевдокоде:

foreach int i in data:
foreach int j in data not equal to i:
if (i + j = 0)
print(i, j)

Проблема с этим кодом в том, что он будет печатать повторяющиеся элементы:

2 -2
-2 2
5 -5
-5 5

Возможно, вы не хотите этого поведения, но вы можете улучшить его позже. На данный момент это хорошая отправная точка.

0
По вопросам рекламы [email protected]