Вставьте пару в качестве значения карты - PullRequest
8 голосов
/ 13 мая 2011
typedef pair<unsigned char, unsigned char> pair_k;
map<unsigned char, pair_k> mapping;

Что будет использоваться таким образом:

mapping[100] = make_pair(10,10);

Вопрос:

  1. Это разрешено?Синтаксически это нормально.
  2. Будет ли это доступ в виде массива в отличие от карты?

Ответы [ 4 ]

7 голосов
/ 13 мая 2011

Это выглядит нормально для меня. Но обратите внимание, что это не доступ к массиву; это выглядит так, потому что std::map перегружает operator[]. Если вы выполните mapping.size() впоследствии, вы обнаружите, что это будет 1.

6 голосов
/ 13 мая 2011

std :: map operator[] возвращает ссылку на элемент карты, обозначенный 100 (ключ), который затем перезаписывается парой, возвращенной std :: make_pair (10,10).

Я бы предложил:

map.insert( std::make_pair( 100, std::make_pair(10,10) ) );

Преимущество вызова вставки заключается в доступе к карте только один раз.

2 голосов
/ 13 мая 2011

Почему бы вам не попробовать?

$ cat test.cpp 
#include <map>
#include <cassert>

int main()
{
    using std::map;
    using std::pair;
    using std::make_pair;

    typedef pair<unsigned char, unsigned char> pair_k;
    map<unsigned char, pair_k> mapping;

    mapping[100] = make_pair(10,10);

    assert(1 == mapping.size());
    assert(10 == mapping[100].first);
    assert(10 == mapping[100].second);
    assert(false);
    return 0;
}
$ g++ test.cpp -o test
$ ./test 
Assertion failed: (false), function main, file test.cpp, line 18.
Abort trap
bash-3.2$ 
  1. Это, безусловно, разрешено и ведет себя как ожидалось.
  2. Это доступ к *map* через индекс operator.Это не доступ к массиву.
2 голосов
/ 13 мая 2011

Это совершенно правильный код C ++ в соответствии со стандартом, поэтому он разрешен.Он обращается к карте только как к карте, т. Е. Значение 100 сопоставляется с парой (10,10)

...