Если не считать (очевидного) сначала создания строки в стиле C, а затем ее использования для создания std :: string, есть ли более быстрый / альтернативный / «лучший» способ инициализировать строку из вектора символов?
Если не считать (очевидного) сначала создания строки в стиле C, а затем ее использования для создания std :: string, есть ли более быстрый / альтернативный / «лучший» способ инициализировать строку из вектора символов?
Ответы:
Я думаю, ты можешь просто сделать
std::string s( MyVector.begin(), MyVector.end() );
где MyVector - это ваш std :: vector.
_ITERATOR_DEBUG_LEVEL=1(в этом случае, похоже, все работает нормально).
В C ++ 11 вы можете сделать std::string(v.data())или, если ваш вектор не содержит '\0'в конце std::string(v.data(), v.size()),.
string(&v[0], v.size())тоже должно работать, но только после assert(not v.empty());, поскольку, если вектор пуст, оба v[0]и v.front()будут вызывать неопределенное поведение. В этом, помимо синтаксической простоты отсутствия использования оператора адресации, является реальное преимущество функции C ++ 11 data(), которая работает даже с пустым вектором.
std::string(v.data())строка может быть длиннее. Так что не используйте этот способ.
std::string(v.data(), v.size()), что было прямо упомянуто в ответе именно по этой причине?
std::string s(v.begin(), v.end());
Где v практически все, что можно итерировать. (В частности, begin () и end () должны возвращать InputIterators.)
Для полноты можно использовать другой способ std::string(&v[0])(хотя вам нужно убедиться, что ваша строка заканчивается нулем, и std::string(v.data())обычно это предпочтительнее.
Разница в том, что вы можете использовать предыдущий метод для передачи вектора функциям, которые хотят изменить буфер, чего вы не можете сделать с .data ().
data()для изменения буфера? Мне кажется, что если вы вызываете data()неконстантный вектор, он вернет a T *(и если ваш вектор const, 'v [0] `все T const &равно вернет a ).
vэто была строка, но целевой тип - это строка и vвектор. (Но приятно видеть, что C ++ 17 обеспечивает четность строк с вектором.)
Мне нравится ответ Стефана (11 сентября 2013 г.), но я хотел бы сделать его немного сильнее:
Если вектор заканчивается нулевым ограничителем, вы не должны использовать (v.begin (), v.end ()): вы должны использовать v.data () (или & v [0] для тех, кто был до C ++ 17) ,
Если v не имеет нулевого терминатора, вы должны использовать (v.begin (), v.end ()).
Если вы используете begin () и end () и вектор действительно имеет завершающий ноль, вы получите, например, строку «abc \ 0», которая имеет длину 4, но на самом деле должна быть только «abc».
vector<char> vec;
//fill the vector;
std::string s(vec.begin(), vec.end());
std::vector<char> v2(std::move(v))но сstd::stringновым объектом.