2015-08-01 3 views
1

Как проверить значение карты в заданном Pair без добавления другого узла? Вот упрощенная версия моего кода.Проверить содержимое карты без увеличения размера

#include<iostream> 
#include<map> 

using namespace std; 

struct Pair{ 
    int key1,key2; 
    Pair(int k1,int k2):key1(k1),key2(k2) {} 
    friend bool operator<(const Pair &a, const Pair &b){ 
     return a.key1 < b.key1; 
    } 
}; 
map<Pair,int> m; 
int check(Pair p){ 
    return m[p]; 
} 

void increment(Pair p){ 
    m[p]++; 
} 

int main(){ 

    int x = check(Pair(1,2)); // Should not add new node 
    cout<<x<<endl; 
    increment(Pair(2,3)); 
    x = check(Pair(2,3)); 
    cout<<x<<endl; 

    char ch;cin>>ch; 
    return 0; 
} 
+0

Почему «ключ» в паре _key value_ является самой парой? –

+0

В моей реальной программе 'key' является' SpaceTime'. Вы знаете, пространство и время. –

+0

Btw Почему вы определяете 'struct Pair' вместо использования' std :: pair' или 'std :: tuple'? – Slava

ответ

4

Вы можете использовать std::map::find

int check(Pair p) 
{ 
    auto found = m.find(p); 
    if(found != m.end()) 
     return found->second; 
    return 0; // ?? error not found 
} 

Конечно, что делать, если товар не найден?

Вы могли бы возвращать bool:

bool check(Pair p, int& i) 
{ 
    auto found = m.find(p); 
    if(found == m.end()) 
     return false; // not found 
    i = found->second; // set the output parameter 
    return true; // success 
} 

Вы можете использовать это так:

int main() 
{ 
    int x; 

    if(check(Pair(1,2), x)) 
     cout << x << endl; // only output if x was found 

    increment(Pair(2,3)); 

    if(check(Pair(2,3), x)) 
     cout << x << endl; // only output if x was found 

} 

ПРИМЕЧАНИЕ: Параметр int& i выход проход по ссылке поэтому он может быть изменен изнутри функции. Вот как мы получаем значение, которое мы находим в std::map.

0

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

map<Pair,int> m; 
int check(Pair p){ 
    if(m.count(p) != 0){ 
     return m[p]; 
    } else 
     return 0; 
} 

m.count(p) возвращает 0 когда ключ p не найден на карте. m.count(p) не имеет побочных эффектов и не влияет на размер карты.

+1

Это действительно ускорило мою программу. –

+3

Это работает, но это не оптимально - он выполняет поиск дважды. Кого можно избежать с помощью '.find()' (см. Ответ Галика). –

+0

Привет, Пол, я полностью согласен с вами, теоретически использование '.find()', безусловно, более оптимально. Хотя я не совсем понимаю, на самом деле, хороший компилятор, вероятно, будет производить один и тот же машинный код. В дополнение к этому, написание читаемого кода почти всегда лучше, чем создание более эффективного кода. Поэтому, я думаю, использование '.find()' является преждевременной оптимизацией. – frmsaul

Смежные вопросы