【发布时间】:2013-06-05 23:15:24
【问题描述】:
我只是尝试使用 C++11 的基于范围的 for 循环从字符串中删除所有空格;但是,我在basic_string::erase 上不断收到std::out_of_range。
#include <iostream>
#include <string>
#include <typeinfo>
int main(){
std::string str{"hello my name is sam"};
//compiles, but throws an out_of_range exception
for(auto i : str){
std::cout << typeid(i).name(); //gcc outputs 'c' for 'char'
if(isspace(i)){
str.erase(i);
}
}
std::cout << std::endl;
//does not compile - "invalid type argument of unary '*' (have 'char')"
for(auto i : str){
if(isspace(*i)){
str.erase(i);
}
}
//works exactly as expected
for(std::string::iterator i = begin(str); i != end(str); ++i){
std::cout << typeid(*i).name(); //gcc outputs 'c' for 'char'
if(isspace(*i)){
str.erase(i);
}
}
std::cout << std::endl;
}
所以我想知道:前两个循环中的i 到底是什么?为什么它看起来既是 char(由 typeid 验证)又是 iterator 到 char(与 std::string::erase 一起使用)?为什么它不等于最后一个循环中的iterator?在我看来,它们的功能应该完全相同。
【问题讨论】:
标签: c++ string c++11 iterator auto