Я пытаюсь распечатать все элементы каждого вектора из мультимножества векторов. Сборка не удалась, но ошибка происходит где-то в заголовочном файле, боюсь, я не совсем понимаю коды ошибок. Любая помощь будет принята с благодарностью! Вот ошибка:
error: invalid conversion from 'const std::basic_string<char, std::char_traits<char>, std::allocator<char> >* const' to 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >*'
И вот код, вызывающий проблемы.
multiset<vector < string > > setOfRules;
vector<string> testing,testing2;
testing.push_back("bar");
testing.push_back("foo");
testing2.push_back("foo2");
testing2.push_back("bar2");
setOfRules.insert(testing);
setOfRules.insert(testing2);
for (multiset< vector <string > >::iterator myIterator = setOfRules.begin();
myIterator!=setOfRules.end();
++myIterator)
{
for (vector< string >::iterator myOtherIterator = ( *myIterator ).begin();
myOtherIterator != ( *myIterator ).end();
++myOtherIterator)
{
cout << *myOtherIterator << " " ;
}
cout << endl;
}
Стандарт C ++ 11 утверждает, что для ассоциативных контейнеров, где тип значения совпадает с типом ключа, и то и другое итератор и const_iterator являются постоянные итераторы.
Так на самом деле multiset<vector<string>>::iterator
является const_iterator
, Тот же трюк с std::set
итераторы — все они консты.
Это означает, что vector<string>::iterator myOtherIterator = *myIterator.begin()
заявление не удастся, потому что вы пытаетесь получить неконстантная итератор из Const объект (предоставленный *myIterator
который const
).
Для исправления нужно использовать vector<string>::const_iterator
:
for(multiset<vector<string>>::const_iterator myIterator = setOfRules.begin();
myIterator != setOfRules.end(); ++myIterator)
{
for(vector<string>::const_iterator myOtherIterator = *myIterator.begin();
myOtherIterator != *myIterator.end(); ++myOtherIterator)
{
cout << *myOtherIterator << " ";
}
cout << endl;
}
имея равнину multiset<XXX>::iterator myIterator
неправильно, потому что если вы делаете
*myIterator = ...;
тогда вы разрушите мультимножество.
использование const_iterator
вместо
for (multiset< vector <string > >::const_iterator myIterator = setOfRules.begin(); myIterator!=setOfRules.end(); ++myIterator) {
Я думаю, и это только предположение, потому что вы не показываете весь необходимый код, чтобы знать, что вы используете неправильный тип итератора. Похоже на то, что вам нужно использовать const_iterator, потому что ваши объекты постоянны.
Вы не можете назначить ключевую часть ассоциативного контейнера (например, мультимножество). Это означает, что ваш вектор является константой. Вам нужен константный итератор для итерации.
Мультимножество выглядит неконстантным. Вам не нужен константный итератор для навигации по нему. Константный тип значения, который он содержит, защитит от присвоения ключу.