Как понятно из приведенного ниже кода, я бы хотел иметь набор объектов objectSet, каждый из которых содержит str1 и str2.Набор имеет ключ на str1, и любые новые объекты с str1, уже находящиеся в objectSet, не будут добавлены, но если этот новый объект имеет другой str2, я хочу отслеживать тот факт, что я видел его в str2Set
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include <set>
#include <map>
using namespace std;
class Object {
public:
string _str1;
string _str2;
set<string> _str2Set;
bool operator<(const Object& b) const {
return _str1 < b._str1;
}
};
int main(int argc, char *argv[]) {
set<Object> objectSet;
Object o;
o._str1 = "str1";
o._str2 = "str2";
pair< set<Object>::iterator, bool> o_ret = objectSet.insert(o);
if (o_ret.second == false) { // key exists
int temp = (*o_ret.first)._str2Set.size(); // this is apparently fine
(*o_ret.first)._str2Set.insert(o._str2); // this results in the error
}
return 0;
}
Вот ошибка компилятора:
set_test.cpp: В функции 'int main (int, char **)': set_test.cpp: 31: ошибка: передача 'const std:: set, std :: allocator>, std :: less, std :: allocator>>, std :: allocator, std :: allocator>>> в качестве аргумента «this» для std :: pair, _Compare, typename _Alloc:: rebind <_Key> :: other> :: const_iterator, bool> std :: set <_Key, _Compare, _Alloc> :: insert (const _Key &) [с _Key = std :: basic_string, std :: allocator>, _Compare= std :: less, std :: allocator>>, _Alloc = std :: allocator, std :: allocator>>] 'отбрасывает квалификаторы
Я понимаю, что это связано с const, но все еще не могуточно выяснить, в чем проблема или как ее исправить.Просто избавиться от const не помогает.
В качестве альтернативы я попытался сохранить свои объекты в
map<string,Object> objectSet;
И, как ни странно, следующее прекрасно работает:
pair< map<string,Object>::iterator, bool> o_ret = objectSet.insert(pair<string,Object>(o._str1,o));
if (o_ret.second == false) { // key exists
o_ret.first->second._str2Set.insert(o._str2);
}
Конечно, это означаетЯ должен хранить str1 дважды, что я считаю расточительным.Спасибо за ваш вклад.