std :: set разность с самоопределенным типом - PullRequest
4 голосов
/ 11 декабря 2011

Я определил свою собственную структуру как

struct element {

int id;
float value;
}

, и я использую ее с std::set.Я хочу использовать алгоритм set_difference (как уже упоминалось в в предыдущем вопросе для определения разницы двух наборов. Когда я пытаюсь вызвать код, компиляция останавливается со следующим сообщением об ошибке:

/usr/include/c++/4.2.1/bits/stl_algobase.h:268: error: passing 
'const element' as 'this' argument of 'element& element::operator=(const element&)' 
discards qualifiers

Минимальный пример может выглядеть так:

std::set<struct element> s1;
std::set<struct element> s2;
std::set<struct element> s3;

element e1 = { 1, 11.0 };
element e2 = { 2, 22.0 };
element e3 = { 3, 33.0 };

s1.insert(e1);
s1.insert(e2);
s2.insert(e2);
s2.insert(e3);

set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(), s3.begin());

1 Ответ

12 голосов
/ 11 декабря 2011
set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(),
               std::inserter(s3, s3.begin()));
//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Пример: http://ideone.com/B4Cc1

Если в качестве выходного итератора указать s3.begin(), вы захотите перезаписать переднюю область набора с помощью набораразница.Перезапись требует, чтобы размер набора был больше, чем результат, что, очевидно, не соответствует действительности в большинстве случаев;даже если набор не пустой, вы не можете использовать s3.begin() в качестве выходных данных, поскольку итератор доступен только для чтения (в противном случае он разрушит отсортированный порядок).

OTOH, std::inserter(x, cit) означает, что всякий раз, когдаэтот выходной итератор назначен (*it = y), будет вызван метод вставки (x.insert(cit, y)), что вам действительно нужно: заполнить набор из пустого.

...