[英]boost::any_range and operator []
请考虑以下代码:
#include <boost/range.hpp>
#include <boost/range/any_range.hpp>
#include <boost/range/join.hpp>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <list>
struct TestData {
TestData() : m_strMem01("test"), m_intMem02(42), m_boolMem03(true) {}
std::string m_strMem01;
int m_intMem02;
bool m_boolMem03;
};
struct IntComp {
bool operator()(const TestData &s, int i) { return s.m_intMem02 < i; }
bool operator()(int i, const TestData &s) { return i < s.m_intMem02; }
bool operator()(const TestData &i, const TestData &s) {
return i.m_intMem02 < s.m_intMem02;
}
};
struct StrComp {
bool operator()(const TestData &s, const std::string &str) {
return s.m_strMem01 < str;
}
bool operator()(const std::string &str, const TestData &s) {
return str < s.m_strMem01;
}
bool operator()(const TestData &i, const TestData &s) {
return i.m_strMem01 < s.m_strMem01;
}
};
typedef boost::any_range<TestData, boost::forward_traversal_tag,
const TestData &, std::ptrdiff_t> TestRange;
std::vector<TestData> vecData(10);
std::list<TestData> listData(20);
TestRange foo() {
TestRange retVal;
auto tmp1 = std::equal_range(vecData.cbegin(), vecData.cend(), 42, IntComp());
retVal = boost::join(retVal, tmp1);
auto tmp2 =
std::equal_range(listData.cbegin(), listData.cend(), "test", StrComp());
retVal = boost::join(retVal, tmp2);
return retVal;
}
int main(int argc, char *argv[]) {
auto res = foo();
for (auto a : res) {
std::cout << a.m_strMem01 << std::endl;
}
//std::cout << res[4].m_intMem02 << std::endl;
}
如果取消注释最后一行代码失败,因为distance_to
没有为any_forward_iterator_interface
实现。 我不确定我到底错过了什么,比如实现operator[]
或distance_to
但是为了什么? 我自己的版本遍历标记? 为什么它首先不起作用?
我想说答案取决于你的性能需求和你实现新的迭代器抽象时的懒惰。 你的[]运算符不工作的核心原因是std :: list <...>不提供随机访问遍历迭代器。 如果你选择了一个提供这种迭代器的容器。 你any_range <...>可以采取random_access_traversal_tag,一切都会好的。 我认为公平地说,在列表顶部实现随机访问迭代器并不是一件大事,只需封装当前索引,并在每次访问特定位置时在列表中向前和向后计数,但是这明显违背了表现性质的性质。
当然any_iterator(它是any_range实现的基础)不会无条件地模拟你传递的任何奇数迭代器的RandomAccess迭代器。
如果你想要它,只需创建一个执行此操作的迭代器适配器(使列表中的随机访问元素非常慢 - 所以不要这样做)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.