Как построить std :: string из std :: vector <char>? - PullRequest
103 голосов
/ 25 февраля 2011

Если не считать (очевидного) построения строки в стиле C сначала, а затем использовать ее для создания std :: string, есть ли более быстрый / альтернативный / "лучший" способ инициализации строки из вектора символов?

Ответы [ 6 ]

177 голосов
/ 25 февраля 2011

Ну, лучший способ - использовать следующий конструктор:

template<class InputIterator> string (InputIterator begin, InputIterator end);

, что приведет к чему-то вроде:

std::vector<char> v;
std::string str(v.begin(), v.end());
39 голосов
/ 25 февраля 2011

Я думаю, вы можете просто сделать

std::string s( MyVector.begin(), MyVector.end() );

, где MyVector - это ваш std :: vector.

33 голосов
/ 11 сентября 2013

С C ++ 11 вы можете сделать std::string(v.data()) или, если ваш вектор не содержит '\0' в конце, std::string(v.data(), v.size()).

12 голосов
/ 25 февраля 2011
std::string s(v.begin(), v.end());

Где v почти что итеративно.(В частности, begin () и end () должны возвращать InputIterators.)

3 голосов
/ 17 ноября 2014

Просто для полноты, другой способ - std::string(&v[0]) (хотя вам нужно убедиться, что ваша строка заканчивается на ноль, и std::string(v.data()) обычно предпочтительнее.

Разница в том, что вы можете использовать прежнюю технику для передачи вектора в функции, которые хотят изменить буфер, что вы не можете сделать с помощью .data ().

1 голос
/ 17 июля 2019

Мне нравится ответ Стефана (11–13 сентября), но я бы хотел сделать его немного сильнее:

Если вектор заканчивается нулевым терминатором, вы не должны использовать (v.begin (), v.end ()): вы должны использовать v.data () (или & v [0] для тех, кто до C + +17).

Если v не имеет нулевого терминатора, вы должны использовать (v.begin (), v.end ()).

Если вы используете begin () и end () и у вектора действительно есть завершающий ноль, вы получите, например, строку "abc \ 0", которая имеет длину 4, но должна быть только " а».

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