/ info是一个字符串 /
while(getline(cin,info)){
char *a = new char[info.size()+1];
a[info.size()] = 0;
memcpy(a,info.c_str(),info.size());
//cout<<sizeof(a)<<endl;
set<char *>m;
m.insert(a,a+8);
}
//错误:从char转换为char *
无效答案 0 :(得分:1)
我怀疑你错过的是当你insert
一个范围时,它会插入该范围内的每个项目。它不会尝试将它们作为单个项目插入,但会单独插入范围内的每个项目。
set<char *>m;
m.insert(a,a+8);
好的,m
是set
的{{1}}。您已经说过要插入char*
到a
范围内的所有内容。这是一系列角色。因此,您尝试将字符插入到一组指向字符的指针中。那无能为力。
也许你只想要a+8
?由于m.insert(a);
是m
set
且char*
是a
,我无法想象除了插入它之外您还想做什么
答案 1 :(得分:0)
m.insert(a,a+8);
您尝试使用set::insert()
的错误重载。当你想做这样的事情时,它最有用:
int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
std::set<int> m;
m.insert(a[0]);
m.insert(a[1]);
...
m.insert(a[6]);
m.insert(a[7]);
这很冗长,我们希望避免重复。同样,你可以写
int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
std::set<int> m;
m.insert(a, a+8);
现在让我们回到你的代码......
while(getline(cin,info)){
char *a = new char[info.size()+1];
...
set<char *>m;
m.insert(a,a+8);
相反,您可以将其“扩展”为
while(getline(cin,info)){
char *a = new char[info.size()+1];
...
set<char *>m;
m.insert(a[0]);
m.insert(a[1]);
...
m.insert(a[6]);
m.insert(a[7]);
现在您看到最终insert
char
对象转到了std::set<char *>
。这就是您收到错误消息的原因。
您在 set<char *> m
循环中定义了while
。这意味着你在m
循环的每次迭代中处理一个新构造的while
,这是没有意义的。您需要将m
的定义移至while
之前。
在C ++中花费5 - 6年之前,不建议使用new char[...]
。 C ++已经为std::string
和/或std::vector
准备了替换99%的原始new char[...]
用例。因此,set
应为set<string> m
。
std::string
有一个赋值运算符(和一个复制构造函数),它为std::string
或NUL终止const char *
并memcpy()
为你做,你可以认为{ {1}}在内部调用它。
set::insert()
还支持子字符串操作,返回一个新的std::string
,使std::string
。
这意味着您根本不需要中间变量string("abcde").substr(3) == "abc"
。
经过这些更正,你会得到
a