Обход карты - PullRequest
       81

Обход карты

0 голосов
/ 28 апреля 2020

Я получаю ошибку в этом коде? Может кто-нибудь сказать причину? Подобный код, доступный на GFG, работает, хотя. Прикрепленный код. предположим, что заголовочный файл bits/stdc++.h и namespace std.

int main()
{
   int n;
   cin >> n;
   map<ll, vector<int>> val;
   ll arr[n] = { 0 };
   for (int i = 0; i < n; i++)   cin >> arr[i];
   for (int i = 0; i < n; i++)   val[arr[i]].push_back(i);
   for (auto i : val) 
   {
      cout << "Element        Indexes\n";
      cout << val.first << " ----> ";
      for (auto j : val.second)
         cout << j << " ";
      cout << "\n";
   }
   return 0;
}

Сообщение об ошибке

prog.cpp: In function ‘int main()’:
prog.cpp:15:21: error: ‘class std::map<long long int, std::vector<int> >’ has no member named ‘first’
         cout << val.first << " ----> " ;
                     ^
prog.cpp:16:33: error: ‘class std::map<long long int, std::vector<int> >’ has no member named ‘second’
         for(auto const &j : val.second)        
                                 ^

1 Ответ

2 голосов
/ 28 апреля 2020

Как в сообщении об ошибке говорится, что val - это тип std::map<ll, std::vector<int>>, не имеет первого и второго члена, скорее, подчеркивание std::pair<const ll, std::vector<int>> имеет их.

Значение вашего первого для l oop. (при условии, что ll является псевдонимом типа для long long)

for (auto i : val) // auto = std::pair<const ll, std::vector<int>>

для этого у вас должно быть

for (const auto& i : val)    // auto = std::pair<const ll, std::vector<int>>

{
    // code
    for (auto j : i.second)  // auto = std::vector<int>
      // code
}

Или если вы используете , вы можете использовать структурированное связывание для более интуитивного

for (const auto&[key, valVector] : val)
//              ^^^^^^^^^^^^^^^^
{
   std::cout << "Element  Indexes\n" << key << " ----> ";
   for (auto j : valVector)
      std::cout << j << "\n";
}

Помните, VLA не являются частью стандарта C ++ , предпочтительнее использовать std::vector вместо.

std::vector<ll> arr(n);
...