c++ - 为什么这段代码没有找到我的集合中最长字符串的长度?

标签 c++ iterator set

我在 C++ 中遇到了一个非常奇怪的集合迭代器问题。

set<string> dict;
dict.insert("hello");
dict.insert("my");

int maxLen = INT_MIN;

set<string>::iterator itr;
for (itr=dict.begin(); itr!=dict.end(); itr++) {
    int len = (*itr).length();
    if ( len > maxLen )
        maxLen = (*itr).length();
}

这段代码帮助我将 maxLen 设置为 5,这是单词集中最长单词的长度。

set<string> dict;
dict.insert("hello");
dict.insert("my");

int maxLen = INT_MIN;

set<string>::iterator itr;
for (itr=dict.begin(); itr!=dict.end(); itr++) {
    if ( (*itr).length() > maxLen )
        maxLen = (*itr).length();
}

但是,这段代码不能给我正确的结果。在我运行代码后,maxLen 仍然是 INT_MIN 的值。基本上没有任何变化,只是我不再使用变量来保存 (*itr).length() 的值。

这对我来说很奇怪。我错过了什么吗?我只是想澄清我对迭代器使用的疑虑。

非常感谢!

最佳答案

我认为这里的问题是 string::length 函数返回一个 unsigned 类型,而您使用的 int 类型是签名。在有符号值和无符号值之间的比较中,有符号值总是首先转换为无符号值。在您的情况下, INT_MIN 到无符号值的转换使其具有最大可能的无符号值,因为 INT_MINUINT_MAX 是一样的。

这第一次起作用的原因是无符号值在分配给临时变量时被转换为 int

要解决此问题,请在以下位置添加强制转换:

for (itr=dict.begin(); itr!=dict.end(); itr++) {
    if ( int((*itr).length()) > maxLen )
        maxLen = (*itr).length();
}

只要您愿意,您还可以在此处进行许多其他样式修复,例如

  • 将后增量 ++ 切换为前增量 ++ 以提高效率,
  • 使用 -> 而不是 (*).,
  • 在运算符周围添加空格,以及
  • 在循环中局部声明迭代器

此处显示:

for (set<string>::iterator itr = dict.begin(); itr != dict.end(); ++itr) {
    if (int(itr->length()) > maxLen) {
       maxLen = itr->length();
    }
}

或者,如果您有一个兼容 C++11 的编译器,则使用基于范围的 for 循环:

for (const auto& val: dict) {
    if (int(val.length()) > maxLen) {
       maxLen = val.length();
    }
}

希望这对您有所帮助!

关于c++ - 为什么这段代码没有找到我的集合中最长字符串的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19507975/

相关文章:

C++ 运算符优先级 =、* 和++

c++ - 如何跟踪 C++ vector 上的当前和上一个迭代器?

jquery - 使用 jQuery 的 ".val()"设置表单中隐藏字段的值不起作用

arrays - 在 swift 中比较两个数组有任何一个相同的元素

c++ - 添加自定义比较器时无法插入要设置的新元素

c++ - C++跨平台延迟毫秒

c++ - universal dynamic_cast<void*> 等价于多态和非多态类型

c++ - 检查类型是否为 Eigen3 类型

python - 为迭代器的每个元素创建一个包含 2 个条目的列表

python - 将函数映射到列表迭代器的列