Каков тип автоматического итератора const & map? C ++ - PullRequest
0 голосов
/ 28 августа 2018

Мне нужно исправить некоторые ошибки в моем старом проекте, и я подумал, что это идеальная возможность для рефакторинга некоторого кода.

У меня есть карта следующей структуры:

std::map< std::string, std::map<std::string, myClass*> > ComponentMap;

Где-то мне нужно перебрать некоторые базовые подкарты, и я использовал следующее:

for (std::map<std::string, myClass* >::iterator iter = ComponentMap[compNameString].begin(); iter != ComponentMap[compNameString].end(); ++iter)
{
 //some code
 if (IsComponentOfType(iter, sCOMP_PRINCIPAL))
     iter->second->GetComponentValue(date, compName, 00);
 //some more code
}

Функция IsComponentOfType имеет следующее объявление:

bool IsComponentOfType(const std::map<std::string, myClass* >::iterator & MapIter, const sCOMPONENT_TYPE & Type)

Мой вопрос: Когда я переписал цикл for следующим образом:

for (auto const& iter: ComponentMap[compNameString])

Я получил следующую ошибку компиляции:

IsComponentOfType(const std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>> &,const sCOMPONENT_TYPE &)': cannot convert argument 1 from 'const std::pair<const _Kty,_Ty>' to 'const std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>> &'

Какого типа мне нужно переписать первый аргумент функции, чтобы "заставить" работать синтаксис c ++ 11?

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

C ++ 11 для циклов зацикливания элементов.

Резервное копирование и возврат к коду рабочего цикла. Затем добавьте строку auto const& elem=*iter; вверху цикла.

Далее, строка за строкой, исключите использование iter в теле цикла. Убедитесь, что код компилируется и запускается после изменения каждой строки.

if (IsComponentOfType(iter, 

изменить это на

if (IsComponentOfType(elem, 

в коде C ++ 03 и заставить его компилироваться (измените IsComponentOfType, чтобы получить std::pair<std::string const, myClass*> const&).

iter->second

изменить это на

elem.second

как только это будет сделано (и аналогично в других местах), измените цикл на стиль C ++ 11:

for (auto const& elem: ComponentMap[compNameString])

и готово.

0 голосов
/ 28 августа 2018

На основе диапазона для петли :

attr(optional) for ( range_declaration : range_expression ) loop_statement

range_declaration - объявление именованной переменной, , тип которой является типом элемента последовательности, представленной range_expression, или ссылкой на этот тип . Часто использует автоматический спецификатор для автоматического вывода типа.

Так как iter является значением,
Вместо:

iter->second->GetComponentValue(date, compName, 00);

Это должно работать:

iter.second->GetComponentValue(date, compName, 00);
0 голосов
/ 28 августа 2018

С

std::map< std::string, std::map<std::string, myClass*> > ComponentMap;

и

for (auto const& iter: ComponentMap[compNameString]) {}

Тип iter будет фактически выведен на std::map<std::string, myClass*>::value_type const&, что равно std::pair<std::string const, myClass*> const&.

То, что вы получаете с петлей for на основе диапазона , является , а не итератором, это значение . Каждое значение соответствует элементу в контейнере, над которым вы зацикливаетесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...