gpt4 book ai didi

c++ - 为什么默认构造的迭代器可以用于单程结束地标?

转载 作者:太空狗 更新时间:2023-10-29 23:46:51 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com