C++ c++;字符串迭代器

C++ c++;字符串迭代器,c++,string,iterator,C++,String,Iterator,我试图在循环中对字符串使用迭代器执行if语句,但无法确定如何获取if语句的当前字符: for (std::string::iterator i=buffer.end()-1; i>=buffer.begin(); --i) { if (!isalpha(*i) && !isdigit(*i)) { if(i != "-") { // obviously this is wrong buffer.erase(i);

我试图在循环中对字符串使用迭代器执行if语句,但无法确定如何获取if语句的当前字符:

for (std::string::iterator i=buffer.end()-1; i>=buffer.begin(); --i) {
    if (!isalpha(*i) && !isdigit(*i)) {
        if(i != "-") { // obviously this is wrong
            buffer.erase(i);
        }
    }
}
有人能帮我获取当前角色,这样我就可以做一些额外的if语句了吗

我不知道如何获得当前角色

你在这里做两次:

if (!isalpha(*i) && !isdigit(*i))
当您取消引用迭代器(
*i
)时,您将获得它所指向的元素

"-"
这是字符串文字,不是字符。字符常量使用单引号,例如,
'-'

for (std::string::iterator i=buffer.end()-1; i>=buffer.begin(); --i)
使用反向迭代器会更简单:

for (std::string::reverse_iterator i = buffer.rbegin(); i != buffer.rend(); ++i)

要获取字符,只需说
*i
,但这还不够。您的循环不合法,因为在
开始之前不允许递减。您应该使用反向迭代器或
remove\u if
算法。

在前面的
if
语句中就有这样的算法:
i
是迭代器,因此
*i
给出迭代器引用的字符

请注意,如果要向后遍历集合,则通常更容易使用
反向迭代器
,与
rbegin
rend
一起使用。不过,我可能会使用预先打包的算法

if(i != "-")
应该是

if(*i != '-')

其他答案解决了您遇到的特定问题,但您应该知道,有不同的方法可以解决实际问题:删除填充条件的元素。使用“删除/擦除”习惯用法可以轻松解决这一问题:

虽然一开始这可能看起来很麻烦,但一旦您多次看到它,就不再令人惊讶了,这是一种从向量或字符串中删除元素的有效方法

如果编译器不支持lambda,则可以创建一个函子,并将其作为第三个参数传递给
remove\u(如果
):

// at namespace level, sadly c++03 does not allow you to use local classes in templates
struct mycondition {
   bool operator()( char ch ) const {
      return !isalpha(ch) && !isdigit(ch) && ch != '-';
   }
};
// call:
str.erase( 
    std::remove_if( str.begin(), str.end(), mycondition() ),
    str.end() );

如果((*i)!='-'),以防您需要更多clarification@P.R.“好的捕捉在<代码>”-“<代码> >杰姆斯谢谢:我曾经是一名C++课程的实验指导者,现在我想我的第一件事是‘’和= =使用一个代码>RealSyIsRealths<代码>将更简单。但是
擦除
元素就不那么简单了。@David Rodríguez使用前向迭代器使
擦除
更简单,它还使循环非法,因为它会将迭代器递减到
开始之前
。如果要立即检查特定字符,则实际上不需要isalpha和isdigit检查
// at namespace level, sadly c++03 does not allow you to use local classes in templates
struct mycondition {
   bool operator()( char ch ) const {
      return !isalpha(ch) && !isdigit(ch) && ch != '-';
   }
};
// call:
str.erase( 
    std::remove_if( str.begin(), str.end(), mycondition() ),
    str.end() );