Использовать привязку структуры, когда итератор вектор std :: pair * - PullRequest
1 голос
/ 07 августа 2020

приведенный ниже код показывает, как обычно работает привязка структуры. Он обеспечивает более информативное имя по сравнению с «первым», «вторым».

map<string, string> sites;
sites.insert({ "GeeksforGeeks", "Coding Resources" });

for (auto& [key, value] : sites)
{
   cout << key.c_str() << " " << value.c_str() << endl;
}

Теперь у меня есть std::vector<pair<std::string, People>* > vec; People вот класс, а string его / ее прозвища.

Код, подобный приведенному ниже, не работает, потому что vec содержит указатели.

for (auto & [kay, value] : vec) {}

Тогда что мне делать, чтобы использовать привязку структуры для предоставления более описательных имен?

Редактировать :

Я использую указатели, потому что хочу избежать копий. Вот как я создаю std::vector<pair<std::string, People>* > vec;.

У меня unordered_map<string, People>, мне нужно распечатать результаты для клиентов детерминированным c способом, но порядок обхода карты случайный. Итак, я создаю vec и сортирую vec по строке, которая является ключом.

Если не использовать указатели, будет получено много копий, если я захочу отсортировать.

1 Ответ

4 голосов
/ 07 августа 2020

Вы можете сделать следующее с std::vector<pair<std::string, People>* > vec;

for (std::pair<std::string, People>* pairPtr : vec) // iterate via pair-ptrs
{
   if (pairPtr) // if the pointer is valid!
   {
      const auto& [key, people] = *pairPtr;
      // do something with the key and vale!
   }
}

Если указатель пары указывает на массив, вам нужно выполнить итерацию и сделать то же самое.

BTW, взгляните на интеллектуальные указатели довольно сырой указатель в C ++ 17.

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