передача строкового литерала в std :: map :: find (..) - PullRequest
1 голос
/ 17 марта 2010

У меня есть std :: map:

std::map<std::string, std::string>

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

.find("blah");

. Однако я хотел объявить его заранее, вместо жесткого кодирования строки, поэтому у меня есть несколько вариантов:* Они все работают.(или хотя бы компилировать).У меня вопрос, какой я должен использовать?в чем преимущество / недостаток перед другими?

Ответы [ 4 ]

6 голосов
/ 17 марта 2010

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

2 голосов
/ 17 марта 2010

Преимущества и недостатки:

const std::string mystring = "blah";

Это в значительной степени стандартный C ++ способ работы со строками. С этим вы можете делать все, что вам когда-либо понадобится со строкой. Основным недостатком является то, что это медленнее. Там есть динамическое распределение. Кроме того, если .find полагается на char[] под сценами, вы теряете всю эту кучу работы, и, возможно, даже придется сделать больше, чтобы получить массив c-usable внутри.

const char mystring[] = "blah";

Это распределяет вашу 5-байтовую строку в стеке, так что это приятно и быстро. Недостатком является то, что если .find использует std :: string, то в любом случае ему придется делать это распределение, и он будет делать это каждый вызов, а не один раз здесь. Кроме того, если вам когда-нибудь придется с ним что-то делать (например, добавлять к нему «.txt»), это было бы гораздо проще сделать с помощью std :: string.

static const char * mystring = "blah";

Если это за пределами области видимости, это означает, что он остается локальным для вашего исходного файла. C ++ способ сделать это с помощью неназванных пространств имен вместо static. Единственным преимуществом такого способа является то, что он совместим с C (или, по крайней мере, с достаточно новыми компиляторами, которые знают, что такое const).

Обычно я бы использовал std :: string. За исключением особых или крайних случаев, простота использования превосходит скорость.

2 голосов
/ 17 марта 2010

(Предполагается, что key_type вашего map равно std::string)

Я бы выбрал опцию, которую вы не указали:

static const std::string mystring("blah");

Таким образом, строка доступна только для чтения и инициализируется только один раз.

0 голосов
/ 17 марта 2010

Я бы предпочел

 const char * const mystring = "blah"; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...