ошибка компилятора при доступе к первой и второй паре внутри карты в c

#c #dictionary #stl #function-pointers #keyvaluepair

#c #словарь #stl #указатели на функции #keyvaluepair

Вопрос:

В чем проблема в строке кода внутри внутреннего цикла for, если блок else?? Доступ к первой и второй паре внутри карты создает проблемы

 #include <iostream>
#include <unordered_map>
#include <utility>

using namespace std;
int main() {
    int t; cin>>t;
    for(int i = 0; i < t; i  ){
        int n; cin>>n; int sum = 0;
        unordered_map<int, pair<int, int>> p;
        for(int i = 0; i < n; i  ){
            int num; cin>>num;
            if( (p[num].second ).first == 0)
                ( (p[num]).second ).first = i;
            else
                ( (p[num]).second ).second = i;
        }
        unordered_map<int, pair<int, int>> :: iterator it = p.begin();
        for(;it != p.end();it  ){
            int diff = abs(it->second.second - it->second.first);
            sum = sum   diff;
        }
        cout<<sum<<endl;

    }
}

 

введите описание изображения здесь

Это ошибки, которые я получаю:

 In function 'int main()':
13:21: error: request for member 'first' in 'p.std::unordered_map<int, std::pair<int, int> >::operator[](num).std::pair<int, int>::second', which is of non-class type 'int'


14:21: error: request for member 'first' in 'p.std::unordered_map<int, std::pair<int, int> >::operator[](num).std::pair<int, int>::second', which is of non-class type 'int'


16:21: error: request for member 'second' in 'p.std::unordered_map<int, std::pair<int, int> >::operator[](num).std::pair<int, int>::second', which is of non-class type 'int'
 

Комментарии:

1. Не могли бы вы более конкретно рассказать о проблемах, пожалуйста? Есть ли ошибка компилятора или результаты не такие, как вы ожидаете?

2. ошибка компилятора при доступе к первой и второй паре внутри карты @BoBTFish

3. пожалуйста, отредактируйте, чтобы поместить ошибку компиляции / внутри / вопроса.

4. unordered_map<int, pair<int, int>> :: iterator it = p.begin(); for(;it != p.end();it ) Это одна из причин, по которой мы теперь имеем auto -> for(auto it = p.begin();it != p.end();it )

5. IMHO этот пример показывает, почему это не очень хорошая идея для использования std::pair . Если вы получаете такие утверждения, как foo[i].first.second[j].second.first вы понятия не имеете, что происходит. Лучше создать свою собственную структуру struct Foo{ int bar, baz; }; .

Ответ №1:

Я думаю, вы путаете итерацию по хэш-таблице и доступ к ее значению с помощью предоставленного ключа.

В вашем первом цикле, чтобы получить доступ к pair <int, int> значению, вы просто выполняете p[num].first (первое int из pair ) или p[num].second .

Это не похоже на ваш цикл итератора, где it->first указывает на ключ, а it->second.first amp; it->second.second указывает на значение пары.