我在将char *插入向量<字符*>
当我执行以下操作时:
string str = "Hello b World d"
char *cstr, *p;
vector<char*> redn;
cstr = new char [ (str.size)+1 ];
strcpy(cstr, str.c_str());
//here I tokenize "Hello b World d"
p = strtok(cstr," ");
while(p!=NULL){
redn.push_back(p);
cout << "just pushed back: " << redn.back() << endl;
p = strtok(NULL," ");
}
delete[] cstr;
//now check
for(it= redn.begin(); it < redn.end(); it++)
cout << *it << endl;
我得到了一个输出:
just pushed back: Hello
just pushed back: b
just pushed back: World
just pushed back: d
p0s
World
d
在我看来,它指的是错误的东西...... 有人会告诉我发生了什么以及如何解决这个问题吗?
答案 0 :(得分:4)
为什么不使用vector<std::string>
?它看起来像这样:
#include <string>
#include <sstream>
#include <iterator>
#include <vector>
#include <iostream>
int main() {
std::string s = "Hello b World d";
std::stringstream stream(s);
std::vector<std::string> tokens(
(std::istream_iterator<std::string>(stream)),
(std::istream_iterator<std::string>()));
for(std::vector<std::string>::iterator it = tokens.begin();
it != tokens.end(); ++it)
std::cout << *it << std::endl;
}
答案 1 :(得分:3)
您的代码有什么问题?
其他答案解释了如何以更好的方式做到这一点。我的回答解释了为什么你的代码没有像你期望的那样工作,并且快速修复它以使其正常工作。
声明:
delete[] cstr;
将对象推入向量后删除字符串,这会导致向量元素指向已经解除分配的内容。
注释掉该行并再次检查,它会起作用。
以下是Ideone上代码的working sample。
在这种情况下,您的向量需要获取删除每个包含的对象指针的所有权,该指针指向动态分配的内存空间。
有关如何执行此操作,请参阅 this 。
答案 2 :(得分:0)
对于STL迭代器,使用以下语法:
vector<char*>::iterator it;
for(it= redn.begin();
it != redn.end();
++it)
{
cout << *it << endl;
}
(注意++它可以提高算法性能)