【问题标题】:Storing C++ strings in STL set在 STL 集中存储 C++ 字符串
【发布时间】:2016-05-04 07:15:10
【问题描述】:
int main(int argc, char** argv) {
    set<string> s;

    s.insert("hi");

    set<string>::iterator it = s.find("hi");

    if (it == s.end()) {
        cout << "Matched." << endl;
    } else {
        cout << "Not matched." << endl;
    }

    return 0;
}

输出显示不匹配。

我想存储一组唯一的字符串。但是 set 中的 find() 没有找到我已经插入的字符串。默认的 less 比较器对象是否不适用于字符串?如果不是,那么如何为字符串分配正确的比较器对象?

【问题讨论】:

  • 而不是 if (it == s.end()) 使用 if (it != s.end()) ,因为 find 将返回一个迭代器到范围内的第一个元素比较等于 val ("hi"),如果没有元素匹配,函数返回 last (s.end())。
  • 顺便说一句,如果您只需要检查一个元素是否存在,count 方法就不会那么冗长了。

标签: c++ string stl set


【解决方案1】:

您可能误解了find() 函数的工作原理。如果它的返回值等于 s.end(),并不意味着它被匹配。相反,这意味着直到到达集合的结束迭代器才能找到您要查找的字符串。

所以你应该按照下面给出的反转 if 语句。

if (it == s.end()) {
    cout << "Matched." << endl;
} else {
    cout << "Not matched." << endl;
}   

if (it != s.end()) {
    cout << "Matched." << endl;
} else {
    cout << "Not matched." << endl;
}  

【讨论】:

  • @siri 没问题。如果您对目前提供的答案感到满意,请记住选择其中一个作为您问题的答案。
【解决方案2】:

if 条件相反,应该是

if (it != s.end()) {
       ~~
    cout << "Matched." << endl;
} else {
    cout << "Not matched." << endl;
}   

std::set::find

返回值

一个元素的迭代器,其 key 等同于 key。如果没有这样的元素 找到后,返回结束(参见end())迭代器。

【讨论】:

    【解决方案3】:

    如果 find("hi") 等于 s.end() 并不意味着它匹配。相反,这意味着直到到达集合的结束迭代器才能找到您要查找的字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-22
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 2012-08-22
      相关资源
      最近更新 更多