int main() {
boost::regex reg("(\\d+),?");
std::string s="1,1,2,3,5,8,13,21";
boost::sregex_iterator it(s.begin(),s.end(),reg);
boost::sregex_iterator end;
regex_callback c;
int sum=for_each(it,end,c).sum();
}
As you can see, the past-the-end iterator passed to for_each is simply a default-constructed instance of regex_iterator.
问题> 由于end
不与任何容器关联,std::for_each
如何将它用作ONE-容器的 PASS-END 地标?
谢谢
最佳答案
需要注意的重要一点是,这不是一般行为。
在标准中,默认构造的迭代器充当“结束”
iostream 迭代器的迭代器,但不适用于 a 的迭代器
容器。通常,这个习语用于输入迭代器,或其他
之前不可能知道序列结束的情况
实际阅读它。 boost::regex
的作者决定遵循
boost::sregex_iterator
的约定;肯定没有
要求他们这样做。但事实是,虽然它是一个前锋
迭代器,通常不可能知道结束在哪里,直到你
尝试推进它,所以使用似乎有点合理。
对于输入迭代器,“等于”的定义
相当松散,所需要的只是迭代器
定义为“结束”比较不等于迭代器不是
定义为“结束”;一个简单的 myIsAtEnd
标志作为成员,和
bool
IteratorType::operator==( IteratorType const& other ) const
{
return myIsAtEnd != other.myIsAtEnd;
}
或
bool
IteratorType::operator==( IteratorType const& other ) const
{
return myIsAtEnd && other.myIsAtEnd;
}
可能就足够了。因为 boost::sregex_iterator
是一个前向
迭代器,而不是简单的输入迭代器,约束有点
更严格,但可以很容易地包含上述内容,例如和
类似于以下内容:
bool
boost::sregex_iterator::operator==(
boost::sregex_iterator const& other )
{
return myIsAtEnd
? other.myIsAtEnd
: (!other.myIsAtEnd
&& myMatchPosition == other.myMatchPosition);
}
默认构造函数只是将 myIsAtEnd
设置为 true。 (另一个
您使用的构造函数将首先尝试找到第一个匹配项,然后
将系统地设置 myIsAtEnd
是否找到匹配项。)
可能值得指出的是,Boost 经常使用
迭代器。标准的迭代器概念或多或少被打破了(因为
它需要两个对象,而不是一个),这或多或少
解决它的标准习语。你会发现它广泛应用于
boost::iterator
同样,用于过滤迭代器。
关于c++ - 为什么默认构造的迭代器可以用于单程结束地标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8651707/