为什么这段代码找不到我集合中最长字符串的长度?
Why isn't this code finding the length of the longest string in my 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
函数返回无符号类型,而您使用的int
类型是有符号的。在有符号值和无符号值之间的比较中,有符号值始终首先转换为无符号值。在您的情况下,将INT_MIN
转换为无符号值会使其采用最大可能的无符号值,因为 INT_MIN
和 UINT_MAX
的位模式是相同的。
第一次这样做的原因是,当分配给临时变量时,无符号值被强制转换为 int
s。
要解决此问题,请重新添加演员表:
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++ 中将集合转换为向量和向量转换为字符串时出现运行时异常
- 将字符串集合中的元素添加到字符串集合的向量中
- 将字符串保存在集合中时,C_STR()仍然有效
- 如何使用for_each,transform,Iterator和lambda的某种组合将STD ::集合的字符串转换为小
- 集合中元素的子字符串
- variadic宏可从未知参数集合中生成字符串向量
- 使用shared_ptr<字符串>转换为一个无序集合<字符串>
- 限制集合中的字符串长度
- 在c++中的graphics.h上打印包含字符串的集合
- remove_if字符串匹配集合中的给定字符串
- 创建字符串 c++ 的常量集集合
- 为什么这段代码找不到我集合中最长字符串的长度?
- 访问集合c++中字符串的第一个字母
- 具有前缀和后缀查询的字符串集合的数据结构
- 如何在<string>没有 std::string 中介的情况下制作一个支持通过 C 字符串查找的集合?
- 生成与集合中的字符串不匹配的字符串
- 具有字符串成员的结构的集合与向量
- 如何在c++中存储一个字符串集合作为键,json作为值