C++ c++;字符串迭代器
我试图在循环中对字符串使用迭代器执行if语句,但无法确定如何获取if语句的当前字符: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);
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() );