- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑以下代码:
#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 并且一切都会好起来的。我认为可以公平地说,通过简单地封装当前索引并在要访问特定位置时在列表中向前和向后计数来在列表顶部实现随机访问迭代器并不是什么大不了的事情,但是这显然违背了列表性能的本质。
关于c++ - boost::any_range 和运算符 [],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27088143/
我正在尝试创建并返回仅包含一个对象的boost:any_range(我不知道这是否是核心问题),但是出现以下错误: 错误C2893:无法专门化功能模板 'range_iterator ::type b
考虑以下代码: #include #include #include #include #include #include #include #include struct TestD
我正在编写一个包装器类,它抽象了 std::map std::vector 和 boost::unordered_map,为此,我已经定义了单独的容器类来封装每个容器和这些类共有的抽象基类。另一个名为
使用 boost::any_range 有什么好处?这是一个例子: typedef boost::any_range integer_range; void display_integers(cons
我正在尝试将使用 boost 转换适配器的 boost 范围包装成 boost 任意范围,但这似乎不起作用。我构建了一个最小的例子来说明。 std::vector myInts = { 1,2,3,4
示例: SomeType bar::foo() const { SomeType retVal; for (auto i = 0u; i ,
函数 boost::spirit::qi::parse() 需要两个迭代器来定义输入范围。如果我尝试从 std::string 或 std::istream 进行解析,这会很有效。现在我想为我的解析器
我观察到以下代码的一个相当奇怪的行为: #include #include #include #include #include #include "gsl.h" template usi
Boost 的 any_range文档说明如下: Despite the underlying any_iterator being the fastest available implementat
这段代码有什么问题: #include #include #include #include using namespace boost::adaptors; using Range =
我最近开始喜欢免费功能std::next和 std::prev显式复制和递增/递减迭代器。现在,我在一个非常具体的案例中看到了奇怪的行为,如果能帮助揭开它的神秘面纱,我将不胜感激。 我有一个在 boo
我想使用 Boost 的 any_range 来处理多个异构数据范围。我的数据范围类型称为 fusion vector ,例如: typedef vector TypeSequence 鉴于这样的类型
我是一名优秀的程序员,十分优秀!