STL итератор не будет работать?Не могу понять, почему - PullRequest
3 голосов
/ 24 ноября 2011

У меня есть класс, у которого есть один закрытый член:

std::set<unsigned long> Sset;

И у меня есть проблема с этой функцией:

Прототип:

Set& Union (Set&, Set&);

Код:

    Set& Set::Union (Set& s1, Set& s2)
{
    set<unsigned long>::iterator a;
    set<unsigned long>::iterator j;

    for (a = s1.Sset.begin(); a!=s1.Sset.end(); ++a)
        for (j = s2.Sset.begin(); j!=s2.Sset.end(); ++j)
            if (*a = *j)
            {
                Sset.insert(*a);
                break;
            }

    return *this;
}

Я получаю, что выражение ошибки компилятора должно быть изменяемым lvalue в *a=*j

С итератором j все в порядке, но он не примет *a

Любая помощь или объяснение?Спасибо

Ответы [ 6 ]

4 голосов
/ 24 ноября 2011

Вы должны использовать == в операторе if?

3 голосов
/ 24 ноября 2011

Вы можете просто вставить один набор в другой за один раз:

std::set<int> s1, s2;

s1.insert(s2.begin(), s2.end());

Участники набора уникальны, так что больше не о чем беспокоиться.

3 голосов
/ 24 ноября 2011
if (*a = *j)

является назначением

if (*a == *j)
3 голосов
/ 24 ноября 2011

Классические ошибки :-) - для сравнения требуются два знака равенства

if (*a == *j)
2 голосов
/ 24 ноября 2011

Нельзя присвоить значение, на которое указывает set::iterator.

Почему?

Поскольку наборы сохраняют свои элементы в любом порядке, в котором они чувствуют себя (set, в частности, отсортировано ) для обеспечения быстрого поиска, поэтому вы не можете вручную указать, куда поместить элементы.

Вместо этого insert элемент вправильное место.

Сказав это - вы хотели использовать == вместо =?

0 голосов
/ 19 апреля 2012
#include <algorithm>

...
std::set_union(s1.begin(), s1.end(), s2.begin(), s2.end() ... )


http://en.cppreference.com/w/cpp/algorithm/set_union

...