2013-12-19 4 views
1

Я довольно новичок в STL. Так что простите меня, если вопрос наивен.Задание ключа карты STL с 3 компонентами

У меня есть пара, подобная этой, которая используется как ключ к карте.

typedef pair <int, int> KeyPair;

Моя карта, как показано ниже

typedef map <KeyPair, uint32> NvInfoMap;

Теперь я хочу, чтобы ввести новое число в ключевой части карты.

Какой самый простой способ сделать это?

Должен ли я сделать еще одну пару, которая займет существующую пару в качестве ее последней части?

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

Спасибо за ваше время.

+3

Рассмотрите возможность использования ['std :: tuple'] (http://en.cppreference.com/w/cpp/utility/tuple) вместо пары. 'typedef tuple KeyType;' –

+0

@SeanCline: Tuple не поддерживается. Решил использовать вложенную пару. – NeonGlow

ответ

4

Если ваши ограничения позволяют C++ 11, а затем

typedef std::tuple<int, int, int> KeyTriple; 

В противном случае, вы можете определить свой собственный тип

struct KeyTriple { 
    int a; 
    int b; 
    int c; 
}; 

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

bool operator<(KeyTriple const & lhs, KeyTriple const & rhs) { 
    if (lhs.a < rhs.a) return true; 
    if (rhs.a < lhs.a) return false; 
    if (lhs.b < rhs.b) return true; 
    if (rhs.b < lhs.b) return false; 
    if (lhs.c < rhs.c) return true; 
    return false; 

    // Alternatively, if you can use C++11 but don't want a tuple for a key 
    return std::tie(lhs.a, lhs.b, lhs.c) < std::tie(rhs.a, rhs.b, rhs.c); 
} 

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

typedef std::pair<int, std::pair<int, int>>; 

с тем преимуществом, что он определяет для вас необходимый оператор сравнения, но недостаток, заключающийся в том, что создание одного и доступ к его элементам является немного фаффом.

+0

Спасибо. Честно говоря, я не знаю, могу ли я использовать C++ 11. Я проверю это сейчас. Это для встроенной цели на основе MIPS. – NeonGlow

+0

Этот 'operator <' очень длинный. Он может быть записан как «return tie» (lhs.a, lhs.b, lhs.c)

+0

@SeanCline: для этого требуется C++ 11, в в любом случае, вы, вероятно, будете использовать 'tuple'. (Я думаю, вы могли бы встраивать массив, а не три переменные, и использовать 'lexicographic_compare', если вы хотите избежать написания этого кода, подверженного ошибкам). –

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