【问题标题】:how to clear a boost::iterator_range如何清除 boost::iterator_range
【发布时间】:2018-09-10 15:42:50
【问题描述】:

我有一个指针 p 指向一个指向向量的boost::iterator 范围。我清除了基础向量。由于底层向量被清除,boost::iterator 范围的迭代器对无效boost::iterator_range 没有 clear 功能。

如何清除boost::iterator 范围?

p->begin() = p->end()

不会导致p.empty()返回true

【问题讨论】:

    标签: c++ boost iterator range


    【解决方案1】:

    使用范围 [end(), end()) 实际上会使 empty() 返回 true。但是,您也可以只分配一个默认构造的迭代器范围:

    *p = {};
    

    以下是各种方法的现场演示:

    Live On Coliru

    #include <boost/range/iterator_range.hpp>
    #include <vector>
    #include <iostream>
    
    int main() {
        std::vector<int> is { 1,2,3 };
        auto range = boost::make_iterator_range(is.begin(), is.end());
        std::cout << "range empty? " << std::boolalpha << range.empty() << "\n";
    
        range = boost::make_iterator_range(is.end(), is.end());
        std::cout << "range empty? " << std::boolalpha << range.empty() << "\n";
    
        is.clear();
    
        range = {};
        std::cout << "range empty? " << std::boolalpha << range.empty() << "\n";
    }
    

    打印

    range empty? false
    range empty? true
    range empty? true
    

    【讨论】:

    • 我的理解是否正确,在上面的示例中,is.begin() 和 is.end() 返回右值?我认为是这样,因为只有当函数通过引用返回时,才能从函数返回左值。在这种情况下,is.begin() 和 is.end() 都按值返回。
    • @SharuGupta 关于这些问题,请参阅确认这一点的the documentation。按值传递/返回迭代器是普遍的设计约定(因为它们丰富了指针概念)。最后,iterator_range&lt;&gt; 模拟 Range 概念,而不是迭代器的 pair&lt;&gt;tuple&lt;&gt;。如果是这样,期望迭代器通过引用公开会更有意义
    猜你喜欢
    • 2016-07-21
    • 2012-06-24
    • 2012-10-29
    • 2012-10-28
    • 2021-12-08
    • 1970-01-01
    • 2016-12-17
    • 2019-06-26
    • 1970-01-01
    相关资源
    最近更新 更多