Самый элегантный, но, возможно, не самый быстрый способ, о котором я могу подумать, будет следующим:
std::string s = std::accumulate(v.begin(), v.end(), std::string());
char * c = new char[s.size() + 1];
std::strcpy(c,s.c_str());
Хотя я сам не фанат голого динамического распределения и лично никогда бы не использовал его, я оставлю это для вас.
Если вам нужно добавить разделитель пробела между элементами, он станет немного сложнее, и я бы, вероятно, использовал другое решение, например:
std::ostringstream oss;
std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(oss," "));
size_t sz = oss.str().size();
if(sz) --sz; // truncate trailing space if there is one
char * c = new char[sz+1];
std::copy_n(oss.str().c_str(), sz, c);
c[sz] = 0;