Naw*_*waz 35
您可以使用std::transform:
std::transform(vs.begin(), vs.end(), std::back_inserter(vc), convert);
Run Code Online (Sandbox Code Playgroud)
这要求您实施convert()为:
char *convert(const std::string & s)
{
char *pc = new char[s.size()+1];
std::strcpy(pc, s.c_str());
return pc;
}
Run Code Online (Sandbox Code Playgroud)
测试代码:
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];
}
Run Code Online (Sandbox Code Playgroud)
输出:
std::string
std::vector<std::string>
char*
std::vector<char*>
Run Code Online (Sandbox Code Playgroud)
在线演示: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();
}
Run Code Online (Sandbox Code Playgroud)
你已经改变std::vector<char*>到std::vector<const char*>.
现在改造后,如果您更改vs通过插入新的字符串,或通过删除其旧的,那么所有char*的vc可能变得无效.这是一个重点.另一个重点是,您不再需要delete vc[i]在代码中使用.
Nic*_*las 10
你能做的最好的是一个分配std::vector的const char*大小相同的载体.然后,遍历向量的每个元素,调用c_str()以获取字符串数组并将其存储在数组的相应元素中.然后,您可以将指针传递给此向量的第一个元素到相关函数.
代码如下所示:
std::vector<const char *> cStrArray;
cStrArray.reserve(origVector.size());
for(int index = 0; index < origVector.size(); ++index)
{
cStrArray.push_back(origVector[index].c_str());
}
//NO RESIZING OF origVector!!!!
SomeCFunction(&cStrArray[0], cStrArray.size());
Run Code Online (Sandbox Code Playgroud)
需要注意的是,你不能让时间之间进行调整字符串的原始载体,您将获取const char*从S std::strings,和一次调用C函数.
这应该工作:
char ** arr = new char*[vec.size()];
for(size_t i = 0; i < vec.size(); i++){
arr[i] = new char[vec[i].size() + 1];
strcpy(arr[i], vec[i].c_str());
}
Run Code Online (Sandbox Code Playgroud)
编辑:
这里是你如何释放这些数据结构,假设vec仍然具有正确数量的元素,如果你的C函数修改这个数组,你可能需要以另一种方式获得大小.
for(size_t i = 0; i < vec.size(); i++){
delete [] arr[i];
}
delete [] arr;
Run Code Online (Sandbox Code Playgroud)
再次编辑:
如果C函数不修改字符串,则可能没有必要复制字符串.如果你能详细说明你的界面是什么样的,我相信我们可以为你提供更好的帮助.