Правильная идиома для назначения std :: string - PullRequest
5 голосов
/ 06 июля 2011

При построении std::string из const char* я часто использую следующий шаблон:

const char* p = GetString();
std::string s(p);

Полагаю, я мог бы использовать подобный шаблон:

const char* p = GetString();
std::string s = p;

Но когда я хочу присвоить std::string вместо const char* вместо конструирования, у меня слишком много вариантов:

s = p;
s.assign(p);
std::string(p).swap(s);

Являются ли варианты выше более или менее эквивалентными? Что мне лучше и почему?

Ответы [ 4 ]

8 голосов
/ 06 июля 2011

Идите для удобочитаемости, и просто используйте идиоматический operator= для назначения. Кроме того, непосредственно создайте std::string из const char*.

std::string s(GetString());
s = GetString();
3 голосов
/ 06 июля 2011

Обычно, вы просто делаете

std::string s = GetString();.

Для назначения выполните

s = GetString();.

Это означает, чтоstd::string объект имеет максимум информации, доступной для выполнения самой быстрой операции.

2 голосов
/ 06 июля 2011

Операторы = и .assign в значительной степени идентичны, вы должны предпочесть форму оператора =, так как она более читабельна.

Последнее не то же самое.Обмен содержимого действительно уменьшает количество времени, затрачиваемое на создание данного объекта, поскольку он не делает копию, он только перемещает содержимое.Ваш синтаксис сначала копирует p в std :: string, а затем меняет его на s, что не более производительно, чем остальные, поскольку вы все еще дублируете p.Если бы P был std :: string где-то еще, что вы в любом случае уничтожали, это было бы быстрее.

1 голос
/ 06 июля 2011

Первые два в основном одно и то же; assign имеет еще несколько перегрузок, которые позволяют вам делать интересные вещи. Я бы выбрал прямую =, потому что она понятнее.

Последний кажется очень многословным и неинтуитивным; Я не уверен, почему вы это сделали (если только вы не отчаянно пытались вернуть память, используемую s).

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