В большинстве случаев вам не нужен вектор char
, так как std::string
в значительной степени является контейнером char
. std::string
также имеет функции begin
и end
. Также имеется функция c_str()
, которая возвращает c-строку , которую вы можете передать любой функции, которая ожидает const char*
, например:
void f(const char* str); //c-function
std::string s="some string";
f(s.c_str());
Так зачем вам нужен std::vector<char>
?
На мой взгляд, vector<char>
- это очень и очень редкая потребность, но если бы она мне когда-нибудь понадобилась, я бы, наверное, написал:
std::vector<char> v(s.begin(), s.end());
И для меня v.push_back('\0')
не имеет особого смысла. Для вектора не требуется, чтобы последний элемент имел '\0'
, если value_type
равно char
.
Хорошо, как вы сказали, std::string::c_str()
возвращает const char*
, а функция c нуждается в неконстантном char*
, тогда вы можете использовать std::vector
, потому что вы хотите использовать RAII, который реализует вектор:
void g(char* s); //c-function
std::vector<char> v(s.begin(), s.end());
s.push_back('\0');
g(&v[0]);
что мне кажется нормальным. Но RAII - это все, что вам нужно, тогда у вас есть и другой вариант:
{
std::vector<char> memory(s.size()+1);
char *str = &memory[0]; //gets the memory!
std::strcpy(str, s.c_str());
g(str);
//....
} //<--- memory is destroyed here.
Используйте std::strcpy
, std::memcpy
или std::copy
, какой бы ни был быстрый, так как я не могу сказать, какой из них обязательно быстрый, без профилирования.