В вашем коде есть две проблемы.
Сначала , вам необходимо вернуть значение в следующей функции или просто сделать его возвращаемым недействительным.
// you should return a value here or make it return void
int outputSet(int i)
{
cout << i << endl;
}
Second , итераторы в следующих итерациях цикла for аннулированы после удаления текущего.Как только элемент удален, его итератор i также становится недействительным, поэтому для следующих итераторов, основанных на ++ i;
, вы получите ошибку во время выполнения, потому что итератор i теперь указывает на то, что вам нужно "reset "it.
Реализация MSVC
for (set<int>::iterator i = n1Ar.begin(); i != n1Ar.end(); ++i) {
it = n2Ar.find(*i);
if (it != n2Ar.end()) {
list.insert(*i);
// the following iterators become invalidated after the
// current one is removed. You need reset it like
// i = n1Ar.erase(i);
n1Ar.erase(i);
n2Ar.erase(it);
} else {
it = n3Ar.find(*i);
if (it != n3Ar.end()) {
list.insert(*i);
// the following iterators become invalidated after the
// current one is removed. You need reset it like
// i = n1Ar.erase(i);
n1Ar.erase(i);
n3Ar.erase(it);
}
}
}
Редактировать : обратите внимание, что возвращение нового итератора из set :: erase () неСтандартный способ.Это в основном для повышения производительности.
A Более портативное решение
Основная идея - правильно установить следующий итератор перед удалением текущего.
set<int>::iterator i = n1Ar.begin();
while (i != n1Ar.end())
{
it = n2Ar.find(*i);
if (it != n2Ar.end())
{
// the trick is to use "i++" where i is incremented by one while "old" i
// is removed.
list.insert(*i);
n1Ar.erase(i++);
n2Ar.erase(it);
}
else
{
it = n3Ar.find(*i);
if (it != n3Ar.end())
{
list.insert(*i);
n1Ar.erase(i++);
n3Ar.erase(it);
}
else
{
++i;
}
}
}