Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost::任意_范围和运算符[]_C++_Boost_Stl_Boost Range - Fatal编程技术网

C++ boost::任意_范围和运算符[]

C++ boost::任意_范围和运算符[],c++,boost,stl,boost-range,C++,Boost,Stl,Boost Range,考虑以下代码: #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> str

考虑以下代码:

#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;
}
#包括
#包括
#包括
#包括

#include

我认为答案取决于您的性能需求和您在实现新的迭代器抽象时的惰性。[]操作符不工作的核心原因是std::list不提供随机访问遍历迭代器。如果您选择了一个提供这种迭代器的容器。任何范围都可以使用随机访问遍历标记,一切都会很好。 我认为公平地说,在列表顶部实现随机访问迭代器并不是什么大事,只要封装当前索引,并在访问特定位置时在列表中向前和向后计数,但这显然违背了列表性能的本质

  • 是否有充分的理由将其中一个收藏保留在列表中
  • 是否有很好的理由通过随机访问生成的任意_范围
  • 为std::list提供一个低效的随机访问接口值得吗
当然,任何\u迭代器(它是any\u range实现的基础)都不会为您传递的任何奇数迭代器免费模拟RandomAccess迭代器


如果您想这样做,只需制作一个迭代器适配器即可(使随机访问列表中的元素的速度非常慢,所以不要这样做)。

好的观点。首先,列表实现解释了为什么没有操作符[]。根据你的问题。现实生活中没有列表或向量,这只是一个例子。在我的例子中,它是Boost-MIC,它实际上隐藏了它的实现,我不能在上面实现操作符[]。但现在,当我理解“为什么”时,我可以在麦克风中看得更远,也许我可以玩转索引,提供随机访问。@kreuzerkrieg下次,请在问题中提及你真正想要实现的目标。Boost MIC在实现操作员括号时非常清晰(即用于
随机访问
索引和
唯一
索引)。当然,这里需要的是
随机访问
索引。如果你使用它,你的任意范围也会有随机访问。是的,最近我的过于简单的例子比从混乱中拯救更混乱:(我不会:)没有它他们会幸福地生活。。。还是不