Как эффективно скопировать std :: vector <char>в std :: string - PullRequest
5 голосов
/ 12 сентября 2011

Этот вопрос является обратной стороной этого Как эффективно скопировать std :: string в вектор
Я обычно копирую вектор таким образом (строка с нулевым символом в конце)

std::string s((char*)&v[0]);

или (если строка уже была объявлена), как это

s = (char*)&v[0];

Он выполняет свою работу, но, возможно, есть и лучшие способы.

EDIT

Кастинги в стиле C ужасны, мне сказали, что насчет этого

s = reinterpret_cast<char*>(&vo[0]);

Ответы [ 3 ]

13 голосов
/ 12 сентября 2011

Просто используйте конструктор итератора:

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

( Редактировать ): или использовать конструктор char-pointer-plus-size:

std::string s(v.data(), v.size());   // or &v[0]

Если ваша строка оканчивается нулем и вы хотите опустить терминатор, используйте конструктор char*:

std::string s(v.data());             // or &v[0]

Обновление: Как говорит @Dave, вы можете использовать тот же синтаксис для назначения существующей строке:

s.assign(v.begin(), v.end());
s.assign(v.data(), v.size());  // pointer plus size
s.assign(v.data());            // null-terminated
9 голосов
/ 12 сентября 2011
std::string s( &v[ 0 ] );

генерирует менее половины числа строк кода сборки в Visual C ++ 2005 как

std::string s( v.begin(), v.end() );
1 голос
/ 12 сентября 2011
s.resize( v.size() );
std::copy( v.begin(), v.end(), s.begin() );

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

А на более серьезной ноте:

std::string( (char*)v.data(), v.size() );
s.assign( (char*)v.data(), v.size() );

... может быть безопаснее без потери эффективности.

...