2017-02-27 128 views
2

这与How to convert a vector<char*> to a vector<string>/string问题相反。如何将矢量<string>转换为矢量<char*>

我有一些传统的例程与vector<char*>一起使用,所以我需要改变我的vector<string>

这是我拿出:

std::vector<char*> charVec(strVec.size(),nullptr); 
for (int i=0; i<strVec.size();i++) { 
    charVec[i]= new char(strVec[i].size()+1); 
    charVec[i][strVec[i].copy(charVec[i], strVec[i].size())] = '\0'; 
} 

这是正确的吗?

有没有更好的实现方法?


p.s.当然最后我有:

for (int i=0; i<strVec.size();i++) { 
    delete charVec[i]; 
} 
+0

你的问题是什么? –

+1

你有问题吗?看起来像你已经实现了 – vu1p3n0x

+1

它取决于新的向量是否需要拥有它的字符串,或者它只需要临时查看另一个向量中的字符串。 – Galik

回答

6

这样做的一个更快的方法是

std::vector<const char*> charVec(strVec.size(),nullptr); 
for (int i=0; i<strVec.size();i++) { 
    charVec[i]= strVec[i].c_str(); 
} 

,然后使用所得到的载体。这将为大量数据集的内存分配节省大量时间。

+0

你的结果向量必须是'std :: vector '。 'const char *'不能分配给'char *' – MRB

+0

谢谢,我更正了我的答案。我总是忘记c_str返回一个const指针。 – JeremiahB

2

你可以简单地使用string::c_str()得到串出的std :: string的。更多详情,请参阅How to convert a std::string to const char* or char*?

或者你可以修改一下函数的主体,但只有你知道这是否值得。


当然作为ssell提到的意见,请记住,这种方法你不必当你处理它们摧毁你的琴弦!这是一种折衷,你避免了复制(很酷),但是你必须小心不要阅读垃圾(以防你删除你的字符串)!

+0

我不会推荐'std :: string :: c_str',因为它不安全。如果任何他原来的'std :: string'对象被销毁,'char *'字符串将会失效。像在他的问题中一样复制数据,其他人在他们的答案中做的更好。请参见[什么是std :: string :: c_str()生命周期?](http://stackoverflow.com/questions/6456359/what-is-stdstringc-str-lifetime)。 – ssell

+0

@ssell好点,但我不会用“不要触摸”指令去,我想更多的使用慎用,我会更新! – gsamaras

+1

如果他严格控制范围,那么你的答案是最直接的。只是想警告潜在的危险。 – ssell

3

你为什么要为你的字符串分配新的缓冲区?您将字符指针的vector传递给函数,并最终删除分配的缓冲区。这意味着这些缓冲区是暂时的,只要源vectorvector<string>)存在,就不需要为它们分配内存。

您可以轻松地做到这一点:

std::vector<std::string> vec1 = { "1", "2", "3" }; 
std::vector<const char*> vec2; 

vec2.resize(vec1.size(), nullptr); 

std::transform(std::begin(vec1), std::end(vec1), std::begin(vec2), [&](const std::string& str) 
{ 
    return str.c_str(); 
}); 
+0

或者你可以用'vec2.reserve()'替换'vec2.resize()',然后使用'std :: back_inserter(vec2)'作为输出迭代器。 –

+0

@RemyLebeau当然,好点。我忘记了'std :: back_inserter'。感谢提醒。 – MRB

3

new语句看起来是错误的。你想分配一个足够长的字符串数组。您正在分配一个值为该字符串长度的单个char。我很惊讶你没有得到编译器的警告。

试试这个:

std::vector<char*> charVec; 
for (const auto &str : strVec) { 
    char *charStr = new char[str.size() + 1]; 
    std::strcpy(charStr, str.c_str()); 
    charVec.push_back(charStr); 
} 

唯一的缺点这里要说的是,如果其中一个字符串中嵌入空字符,没有超出将被复制。但我怀疑一个函数几乎可以肯定并不在乎那个。

相关问题