插入set c ++时出错

时间:2016-03-28 11:08:55

标签: c++

/ 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 *

无效

2 个答案:

答案 0 :(得分:1)

我怀疑你错过的是当你insert一个范围时,它会插入该范围内的每个项目。它不会尝试将它们作为单个项目插入,但会单独插入范围内的每个项目。

      set<char *>m;
      m.insert(a,a+8);

好的,mset的{​​{1}}。您已经说过要插入char*a范围内的所有内容。这是一系列角色。因此,您尝试将字符插入到一组指向字符的指针中。那无能为力。

也许你只想要a+8?由于m.insert(a);m setchar*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