В картах STL, это лучше для использования карты:: вставить, чем []?

Согласно документации, minPadding / maxPadding не работает с категориями. Поэтому вы должны использовать i.e datetime xAxis и определить правильный tickInterval / pointInterval.

199
задан danio 17 April 2009 в 15:02
поделиться

6 ответов

Когда Вы пишете

map[key] = value;

нет никакого способа сказать, заменили ли Вы value для key, или если Вы создали новое key с value.

map::insert() только создаст:

using std::cout; using std::endl;
typedef std::map<int, std::string> MyMap;
MyMap map;
// ...
std::pair<MyMap::iterator, bool> res = map.insert(MyMap::value_type(key,value));
if ( ! res.second ) {
    cout << "key " <<  key << " already exists "
         << " with value " << (res.first)->second << endl;
} else {
    cout << "created key " << key << " with value " << value << endl;
}

Для большинства моих приложений, я обычно не забочусь, создаю ли я или заменяю, таким образом, я использую более легкое для чтения map[key] = value.

239
ответ дан netjeff 4 November 2019 в 14:42
поделиться

Эти два имеют различную семантику когда дело доходит до ключа, уже существующего в карте. Таким образом, они не действительно непосредственно сопоставимы.

, Но оператор [] версия требует значения по умолчанию, создающего значение и затем присвоение, поэтому если это более дорого, тогда копируют конструкцию, то это будет более дорого. Иногда конструкция по умолчанию не имеет смысла, и затем было бы невозможно использовать оператор [] версия.

53
ответ дан Greg Rogers 4 November 2019 в 14:42
поделиться

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

:)

19
ответ дан Torlack 4 November 2019 в 14:42
поделиться

Глюк с картой:: вставьте (), то, что это не заменит значение, если ключ уже будет существовать в карте. Я видел код C++, записанный программистами Java, где они ожидали, вставляют () для поведения того же пути как Map.put () в Java, где значения заменяются.

9
ответ дан Anthony Cramp 4 November 2019 в 14:42
поделиться

Одно примечание - то, что можно также использовать Повышение. Присвойтесь:

using namespace std;
using namespace boost::assign; // bring 'map_list_of()' into scope

void something()
{
    map<int,int> my_map = map_list_of(1,2)(2,3)(3,4)(4,5)(5,6);
}
2
ответ дан rlbond 23 November 2019 в 05:09
поделиться

Another thing to note with std::map:

myMap[nonExistingKey]; will create a new entry in the map, keyed to nonExistingKey initialized to a default value.

This scared the hell out of me the first time I saw it (while banging my head against a nastly legacy bug). Wouldn't have expected it. To me, that looks like a get operation, and I didn't expect the "side-effect." Prefer map.find() when getting from your map.

34
ответ дан 23 November 2019 в 05:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: