unordered_map - zwrot domyślnej wartości

0

Używam następującego kontenera:

 
std::unordered_map<std::string, int> myUMap;

Jak uzyskać taki efekt, żeby w przypadku podania błędnego klucza (który nie istnieje) kontener zwrócił domyślną wartość int, np. -1

int a = myUMap["wrongkey"];
// a = -1;
 
0

Ja wyszukanie / pobranie elementu opakował bym w osobna funkcje która sprawdzałaby czy podany element istnieje i wtedy w odpowiedzi na to zdarzenie zwrócił sobie co mi się tam podoba.

0

Też o tym myślałem, tylko odnoszę się do tego kontenera dość często w pętli renderującej i zacząłem się zastanawiać czy jakiś wbudowany sposób nie byłby szybszy. W Qt jest kontener QHash i tam można podać jako drugi argument (funkcja value) wartość domyślną jaka jest zwracana jeśli podano błędny klucz: http://harmattan-dev.nokia.com/docs/library/html/qt4/qhash.html#value-2

0
#include <iostream>
#include <unordered_map>
#include <exception>
using namespace std;

class Foo : unordered_map<string, int> {
	public:
		int operator[](const string& key) const {
			if(find(key) != end) {
				return at(key);
			}
			return -1;
		}
};

int main() {
	Foo f;
	cout << f["abcdef"];
	return 0;
}

Poza faktem, ze jest to wyjatkowo brzydkie, to bedzie dzialac tak jak chcesz.

0

I tak będziesz szukał - co najwyżej przeniesiesz sprawdzenie, czy wartość już występuje "pod maskę". Jeśli chcesz zmienić domyślną wartość to niestety musisz użyć innego niż int typu, który go opakuje i domyślnie nada inną wartość. Trzeba by to przetestować, ale takie rozwiązanie może negatywnie wpłynąć na wydajność.

template<typename T, T def>
struct DefaultInteger
{
    DefaultInteger() : val(def) {}
    DefaultInteger(T val) : val(val) {}
    
    DefaultInteger& operator=(T n) { val = n; return *this; }
    operator T() const { return val; }

    T val;
};

Działać działa - http://ideone.com/OtxVIw - ale ja bym porównał wynik metody find z end i tyle.

2

Widzisz czyli chyba jednak pozostaje Ci to mimo wszystko jakoś obudować ja zrobiłbym to tak

int get_value( const std::string & key )
{
    auto it = myUMap.find( key );
    if( it == myUMap.end() )
        return -1;

    return it->second;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1