【发布时间】:2018-09-10 15:42:50
【问题描述】:
我有一个指针 p 指向一个指向向量的boost::iterator 范围。我清除了基础向量。由于底层向量被清除,boost::iterator 范围的迭代器对无效。 boost::iterator_range 没有 clear 功能。
如何清除boost::iterator 范围?
p->begin() = p->end()
不会导致p.empty()返回true
【问题讨论】:
我有一个指针 p 指向一个指向向量的boost::iterator 范围。我清除了基础向量。由于底层向量被清除,boost::iterator 范围的迭代器对无效。 boost::iterator_range 没有 clear 功能。
如何清除boost::iterator 范围?
p->begin() = p->end()
不会导致p.empty()返回true
【问题讨论】:
使用范围 [end(), end()) 实际上会使 empty() 返回 true。但是,您也可以只分配一个默认构造的迭代器范围:
*p = {};
以下是各种方法的现场演示:
#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
【讨论】:
iterator_range<> 模拟 Range 概念,而不是迭代器的 pair<> 或 tuple<>。如果是这样,期望迭代器通过引用公开会更有意义