c ++: перебирая мультимножество векторов

Я пытаюсь распечатать все элементы каждого вектора из мультимножества векторов. Сборка не удалась, но ошибка происходит где-то в заголовочном файле, боюсь, я не совсем понимаю коды ошибок. Любая помощь будет принята с благодарностью! Вот ошибка:

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;
}

2

Решение

Стандарт 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;
}
5

Другие решения

имея равнину multiset<XXX>::iterator myIterator неправильно, потому что если вы делаете
*myIterator = ...; тогда вы разрушите мультимножество.

использование const_iterator вместо

for (multiset< vector <string > >::const_iterator myIterator = setOfRules.begin(); myIterator!=setOfRules.end(); ++myIterator) {
1

Я думаю, и это только предположение, потому что вы не показываете весь необходимый код, чтобы знать, что вы используете неправильный тип итератора. Похоже на то, что вам нужно использовать const_iterator, потому что ваши объекты постоянны.

Вы не можете назначить ключевую часть ассоциативного контейнера (например, мультимножество). Это означает, что ваш вектор является константой. Вам нужен константный итератор для итерации.

Мультимножество выглядит неконстантным. Вам не нужен константный итератор для навигации по нему. Константный тип значения, который он содержит, защитит от присвоения ключу.

1
По вопросам рекламы [email protected]