std::set 使用 char * 类型查找行为

use*_*316 6 c++ visual-c++ stdset c++11

我有以下代码行:

const char *values[] = { "I", "We", "You", "We"};
std::set<const char*> setValues;

for( int i = 0; i < 3; i++ ) {

    const char *val = values[i];
    std::set<const char*>::iterator it = setValues.find( val );

    if( it == setValues.end() ) {
        setValues.insert( val );
    }
    else {
        cout << "Existing value" << endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

有了这个,我试图在 a 中插入非重复值set,但不知何故代码没有点击打印现有元素并且重复值被插入。

这里有什么问题?

Ana*_*lyS 5

您应该为 const char* 定义 less 谓词并传递到 set 模板中,以使 set 对象与指针一起正常工作:

  struct cstrless {
    bool operator()(const char* a, const char* b) const {
      return strcmp(a, b) < 0;
    }
  };
  std::set<const char*, cstrless> setValues;
Run Code Online (Sandbox Code Playgroud)

  • 不,你应该使用`std::string`。 (3认同)
  • @LightnessRacesinOrbit 这取决于任务。例如,您可以将字符串数组作为线性大字符串,如下所示:“one\0two\0third\0....”以及指向单词开始的指针。在这种情况下,您可以使用这种方法来查找该项目。 (2认同)