Использование const char * в качестве ключа для карты / unordered_map - PullRequest
0 голосов
/ 30 мая 2018

Как создать карту / unordered_map, которая будет использовать const char* в качестве ключа напрямую?

Если я использую map<std::string,..>, то при каждом разрешении map["abc"] = ... будет создаваться новый объект std::string.Это приводит к большим накладным расходам на выделение памяти, создание строкового объекта и копирование строки в него.

Как объявить объект карты, который использует const char* напрямую, без каких-либо накладных расходов?

Ответы [ 3 ]

0 голосов
/ 30 мая 2018

Если вы будете использовать указатель в качестве ключей карты, он будет сравнивать ключи на основе адресов указателей, одни и те же ключи будут рассматриваться как разные.Поэтому вам придется создавать свою собственную функцию сравнения при работе с простыми указателями, поэтому вам лучше использовать какую-нибудь оболочку для простых указателей, как и в другом предложенном ответе.

0 голосов
/ 30 мая 2018

В качестве альтернативы ответа Rakete1111 string_view , вы можете оборудовать свою карту подходящим компаратором (и хеш-кодом для unordered_map):

struct LesserString
{
  bool operator() (const char *lhs, const char *rhs) const
  {
    return std::strcmp(lhs, rhs) < 0;
  }
};

struct HashString
{
  std::size_t operator() (const char *arg) const
  {
    return however_you_want_to_hash_the_string();
  }
};

struct EqualString
{
  bool operator() (const char *lhs, const char *rhs) const
  {
    return !strcmp(lhs, rhs);
  }
};

std::map<const char*, WhateverValue, LesserString> m1;
std::unorderd_map<const char*, WhateverValue, HashString, EqualString> m2;
0 голосов
/ 30 мая 2018

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

std::map<std::string_view, int> Map;
Map["abc"] = 1; // no allocation necessary to store "abc"

Это в основном оболочка для строковых объектов.И это представление, которое означает, что оно не владеет строкой и, следовательно, не копирует и не выделяет память для хранения строки.

Обратите внимание, что для небольших строк (а также литералов) std::string нене выделяется слишком из-за SSO , поэтому накладные расходы минимальныВсегда измеряйте перед оптимизацией.

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