C++中string迭代器调用it->empty()报错该如何解决?
问题根本原因
std::string的迭代器解引用后得到的是单个char类型字符,不是字符串对象,char作为基础数据类型没有empty()成员方法,it->empty()和(*it).empty()两种写法本质都是调用不存在的成员函数,所以触发类型报错。- 你的判断逻辑混淆了「
string对象本身是否为空」和「迭代器指向的单个字符是否为空」的概念。
常见修正方案
如果你是想遍历整个非空字符串的所有字符,可以把空判断移到循环外,同时注意你原代码漏了引入<string>头文件,仅引入<vector>属于非标准的隐式依赖,正式代码需要补上:
#include <iostream> #include <string> using namespace std; int main () { string s("some string"); if (!s.empty()) { // 先判断整个字符串非空 for (auto it = s.begin(); it != s.end(); it++) { cout<< *it <<endl; } } return 0; }
如果你是想遍历到空字符就停止(类似处理C风格字符串的逻辑),直接判断*it != '\0'即可:
for (auto it = s.begin(); it != s.end() && *it != '\0'; it++)
注意std::string本身末尾的\0不属于迭代器遍历范围,只有手动插入到字符串内部的空字符才会被该判断捕获。
内容的提问来源于stack exchange,提问作者大爱中国
相关产品推荐
相关产品推荐

