Вы можете использовать std::transform
как:
std::transform(vs.begin(), vs.end(), std::back_inserter(vc), convert);
Что требует от вас реализации convert()
как:
char *convert(const std::string & s)
{
char *pc = new char[s.size()+1];
std::strcpy(pc, s.c_str());
return pc;
}
Тестовый код:
int main() {
std::vector<std::string> vs;
vs.push_back("std::string");
vs.push_back("std::vector<std::string>");
vs.push_back("char*");
vs.push_back("std::vector<char*>");
std::vector<char*> vc;
std::transform(vs.begin(), vs.end(), std::back_inserter(vc), convert);
for ( size_t i = 0 ; i < vc.size() ; i++ )
std::cout << vc[i] << std::endl;
for ( size_t i = 0 ; i < vc.size() ; i++ )
delete [] vc[i];
}
Выход:
std::string
std::vector<std::string>
char*
std::vector<char*>
Демо онлайн: http://ideone.com/U6QZ5
Вы можете использовать &vc[0]
там, где вам нужно char**
.
Обратите внимание, что поскольку мы используем new
для выделения памяти для каждой std::string
(в функции convert
), мы должны освободить память в конце. Это дает вам гибкость для изменения вектора vs
; Вы можете push_back
больше строк к нему, удалить существующую из vs
, и vc
(т.е. vector<char*>
все равно будет действительным!
Но если вам не нужна эта гибкость, вы можете использовать эту функцию convert
:
const char *convert(const std::string & s)
{
return s.c_str();
}
И вы должны изменить std::vector<char*>
на std::vector<const char*>
.
Теперь после преобразования, если вы измените vs
, вставив новые строки или удалив из него старые, то все char*
в vc
могут стать недействительными. Это один важный момент. Еще один важный момент: вам больше не нужно использовать delete vc[i]
в своем коде.