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

标签 c++ boost

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/

相关文章:

c++ - 如何将代码点转换为 utf-8?

c++ - Boost Spirit - 将列表提取为单个字符串

c++ - Q : Template class that takes either a normal type or a template template argument

c++ - 如何清除 boost::iterator_range

c++ - boost 变体 istringstream 和流错误

c++ - 使用 Floyd-Warshall 查找所有最短路径和距离

c++ - libicuuc.so.52,需要 libboost_regex-mt.so

c++ - 动态大小的不可调整大小的数组

c++ - QTextFormat 的对象索引是什么?

c++ - 如果读取文件超过 5 分钟则停止 (C++ std::ifstream)