标签: boost-iterators

跳过迭代器

我有一系列值,我想传递给一(iterator begin, iterator end)对函数.但是,我只希望处理原始序列中的每个第二个元素.

有没有一种很好的方法使用Standard-Lib/Boost创建一个迭代器外观,允许我传入原始序列?我认为这样的简单事情已经在boost迭代器或范围库中,但我没有找到任何东西.

或者我错过了另一个完全明显的方法来做到这一点?当然,我知道我总是可以选择将值复制到另一个序列,但这不是我想要做的.

编辑:我知道filter_iterator,但过滤值 - 它不会改变迭代进展的方式.

c++ boost stl boost-iterators

12
推荐指数
1
解决办法
7477
查看次数

使用boost :: iterator

我写了一个稀疏的矢量类(参见#1,#2.)

我想提供两种迭代器:

第一个集合,即常规迭代器,可以指向任何元素,无论是设置还是未设置.如果它们被读取,它们将返回设置值,或者value_type(),如果它们被写入,则它们创建元素并返回左值引用.因此,它们是:

随机访问遍历迭代器可读可写迭代器

第二个集合,即稀疏迭代器,仅迭代set元素.由于他们不需要懒惰地创建写入的元素,因此它们是:

随机访问遍历迭代器可读可写左值迭代器

我还需要两者的const版本,这些版本都是不可写的.

我可以填写空白,但不知道如何使用boost :: iterator_adaptor开始.

这是我到目前为止所拥有的:

template<typename T>
class sparse_vector {
public:
    typedef size_t size_type;
    typedef T value_type;

private:
    typedef T& true_reference;
    typedef const T* const_pointer;
    typedef sparse_vector<T> self_type;
    struct ElementType {
        ElementType(size_type i, T const& t): index(i), value(t) {}
        ElementType(size_type i, T&& t): index(i), value(t) {}
        ElementType(size_type i): index(i) {}
        ElementType(ElementType const&) = default;
        size_type index; …
Run Code Online (Sandbox Code Playgroud)

c++ boost iterator boost-iterators

11
推荐指数
1
解决办法
8119
查看次数

提升迭代器外观和dereference()函数

我正在尝试创建一个迭代器,它只能取消引用实际值类型,而不是引用.是否可以使用boost::iterator_facade,或者它是否要求我具有可由adress\reference返回的值.

为了更具说明性,我的迭代器返回一个std::pair引用,这意味着我的迭代器value_type不会存储在任何地方,而是在解除引用时动态创建(如std::map::iterator).

boost boost-iterators iterator-facade

9
推荐指数
1
解决办法
1598
查看次数

iterator_traits中嵌套指针类型的用途是什么?

std::iterator_traits类模板定义5种嵌套类型:iterator_category,value_type,difference_type,pointerreference.浏览的源极<algorithm>两者的libc ++和libstdc ++的头,一个可以看到的许多用途value_type,difference_typeiterator_category,但只有一个reference(内部std::iter_swap),并没有对pointer.

我的应用程序使用手工构建的代理迭代器/代理引用对.我想转换到使用Boost iterator_facade,它允许我将引用类型从默认配置为T&任意类型,但对于T*默认情况下的指针类型则不是这样.我想避免被嵌套pointer类型的一些深度隐藏使用所困扰.

注意:迭代器是没有嵌套成员的内置类型的代理,因此我不需要兼容operator->(返回类型将是pointer).

:有什么用例是有标准库中的嵌套类型pointer里面iterator_traits

c++ iterator proxy-classes traits boost-iterators

6
推荐指数
1
解决办法
401
查看次数

transform_iterator编译问题

HI,

我不喜欢发布编译问题,但我真的无法想出这个问题.使用此代码:

#include <map>
#include <boost/iterator/transform_iterator.hpp>

using namespace std;

template <typename K, typename V>
struct get_value
{
    const V& operator ()(std::pair<K, V> const& p) { return p.second; }
};

class test
{
    typedef map<int, float> TMap;
    TMap mymap;

public:
    typedef get_value<TMap::key_type, TMap::value_type> F;
    typedef boost::transform_iterator<F, TMap::iterator> transform_iterator;

    transform_iterator begin()
    {
        return make_transform_iterator(mymap.begin(), F());
    }
};
Run Code Online (Sandbox Code Playgroud)

得到这个编译错误:

transform_iterator.hpp(43) : error C2039: 'result_type' : is not a member of 'get_value<K,V>'
        with
        [
            K=int,
            V=std::pair<const int,float>
        ]
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么这不起作用?我正在使用带有boost 1.36.0的Visual Studio 7.0

谢谢.

c++ map boost-iterators

5
推荐指数
2
解决办法
2123
查看次数

Boost Single Pass Iterator和Forward Traversal Iterator之间的区别是什么?

New Iterator Concepts标准提案中,我无法破译Single Pass Iterator和Forward Traversal Iterator之间的任何有用差异.

Forward Traversal表中"++ r"行的"断言/注释"是否表示Forward Traversal Iterators是可复制的,而单遍Iterator不是?

另外,为什么default-construct的附加功能会使迭代器模型成为Forward Traversal?理由是什么?

c++ boost boost-iterators

5
推荐指数
1
解决办法
922
查看次数

在 C++ 中将惰性生成器实现为forward_iterator

MyGenerator 表示(可能)有限的整数序列,计算成本很高。所以我不想预先生成它们并将它们放入容器中。

struct MyGenerator{
  bool HasNext();
  int Next();
}
Run Code Online (Sandbox Code Playgroud)

要打印全部:

MyGenerator generator;
while (generator.HasNext()) {
  std::cout << generator.Next() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

如何实现一个遵循forward_iterator协议的类似生成器?

boost::function_input_iterator很接近,但我不知道前面的元素数量。

c++ boost iterator stl boost-iterators

5
推荐指数
1
解决办法
1059
查看次数

使用指针值类型将unordered_map上的迭代器转换为具有const引用值类型的同一映射上的迭代器

我有以下课程:

#include <unordered_map>
#include <memory>


class Node {
public:
    typedef std::unique_ptr<Node> ptr_type;
    typedef std::unordered_map<char, ptr_type> map_type;

    typedef /**???**/ const_iterator;

    const_iterator begin() const;
    const_iterator end() const;

private:
    map_type _children;
};
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我想要一种方法让这个类的用户迭代元素_children而不能修改它们.这就是为什么我想创建一个指向类型元素的迭代器pair<char, const Node&>而不是pair<char, ptr_type>.

创建一个基础迭代器类对于手头的任务来说似乎有点过于复杂.我已经看过boost迭代器,我想transform_iterator可能是要走的路,但我还没有找到如何让它工作.

虽然我在这里,有谁知道我在哪里可以找到定义的迭代器的不同示例的示例boost-iterators?每个类型的文档中只有一个示例,它们并不总是符合我的需求(我是这个库的新手,我可能错过了一些明显的东西).

更新:这是我尝试使用boost::transform_iterator

class Node {
public:
    typedef std::unique_ptr<Node> ptr_type;
    typedef std::unordered_map<char, ptr_type> map_type;


    struct Transformer {
        std::pair<char, const Node&> operator()(const std::pair<char, ptr_type> &p) const {
            return std::pair<char, const Node&>(p.first, *p.second);
        }
    };

    typedef boost::transform_iterator<Transformer, …
Run Code Online (Sandbox Code Playgroud)

c++ boost-iterators

5
推荐指数
1
解决办法
904
查看次数

将键值对文件读入std :: map

我有一个Visual Studio 2008 C++ 03项目,我想在std :: map中读取键值对的文件.为此,我创建了istreambuf_pair_iterator如下:

typedef std::map< std::string, std::string > Properties;

class istreambuf_pair_iterator : 
    public boost::iterator_adaptor< istreambuf_pair_iterator, 
                                    std::pair< std::string, std::string >*,
                                    boost::use_default, 
                                    boost::forward_traversal_tag >
{
public:
    istreambuf_pair_iterator() : sb_( 0 ) { };
    explicit istreambuf_pair_iterator( std::istream& is ) : sb_( is.rdbuf() ) { };

    private:
    void increment()
    {
        std::string line;
        std::istream is( sb_ );
        std::getline( is, line );

        // TODO: parse the key=value to a std::pair 
        // where do I store the pair???
    };

    friend class …
Run Code Online (Sandbox Code Playgroud)

c++ map boost-iterators

4
推荐指数
1
解决办法
7505
查看次数

为什么boost filter_iterator具有奇怪的make_filter_iterator函数?

在经历了一些痛苦之后,我设法将这个最小的boost filter_iterator示例整合在一起

using namespace std;
std::function<bool(uint32_t)> stlfunc= [](uint32_t n){return n%3==0;};
int main()
{
   vector<uint32_t> numbers{11,22,33,44,55,66,77,3,6,9};
   auto start = boost::make_filter_iterator(stlfunc, numbers.begin(), numbers.end());
   auto end   = boost::make_filter_iterator(stlfunc, numbers.end()  , numbers.end());
   auto elem  = std::max_element(start,end);
   cout << *elem;
}
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但我想知道为什么make_filter_iterator需要numbers.end()?我可能是错用这种方式,我guestimated它从C数组例如:
http://www.boost.org/doc/libs/1_53_0/libs/iterator/example/filter_iterator_example.cpp

c++ boost boost-iterators

4
推荐指数
1
解决办法
3345
查看次数

C++ boost :: ptr_vector <S> :: iterator问题

我有这门课:

template <class S, class P, class A>
class Task
{
  private:

    timeval start;
    boost::ptr_vector<S> states;
    boost::ptr_vector<P> policies;

  public:

    P findPolicy(S *state);
    S findState(S *state);

};
Run Code Online (Sandbox Code Playgroud)

当我尝试使用迭代器定义findPolicy或findState时:

template <class S, class P, class A>
S Task<S,P,A>::findState(S *state)
{
  boost::ptr_vector<S>::iterator it;
  for ( it = policies.begin(); it < policies.end(); ++it)
  {
    // blah 
  }
}
Run Code Online (Sandbox Code Playgroud)

在类之后定义,编译器说:

error: expected ';' before it;
Run Code Online (Sandbox Code Playgroud)

即使尝试在类声明中定义函数也会给出同样的错误.我很困惑,因为到目前为止我一直在使用boost :: ptr_vector迭代器.似乎唯一有用的东西是老式的:

for (int i = 0; i < policies.size(); i++)
  {
    if (policies[i].getState() == state)
    {
     return policies[i]; …
Run Code Online (Sandbox Code Playgroud)

c++ boost-iterators

3
推荐指数
1
解决办法
265
查看次数

C++:尝试遍历 boost::unordered_map&lt;string,int&gt; 时没有匹配 operator&lt;

我有以下代码:

boost::unordered_map<std::string, int> map;
map["hello"]++;
map["world"]++;

for(boost::unordered_map<std::string, int>::iterator it = map.begin(); it < map.end(); it++){
    cout << map[it->first];
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时出现以下错误但不知道为什么?

error: no match for ‘operator<’ in ‘it < map.boost::unordered::unordered_map<K, T, H, P, A>::end [with K = std::basic_string<char>, T = int, H = boost::hash<std::basic_string<char> >, P = std::equal_to<std::basic_string<char> >, A = std::allocator<std::pair<const std::basic_string<char>, int> >, boost::unordered::unordered_map<K, T, H, P, A>::iterator = boost::unordered::iterator_detail::iterator<boost::unordered::detail::ptr_node<std::pair<const std::basic_string<char>, int> >*, std::pair<const std::basic_string<char>, int> >]()
Run Code Online (Sandbox Code Playgroud)

c++ boost unordered-map boost-iterators boost-unordered

2
推荐指数
1
解决办法
1399
查看次数