c++ - vector 的成对迭代

标签 c++ stl vector iterator containers

问题提要

给定一个 std::vector<T> ,如何创建一个 View 来公开 std::vector<std::pair<T, T>> 的界面,其中每对由基础 vector 中的两个连续元素组成?

详情

目标是在同一存储上创建多个容器抽象,即 std::vector<T> .类型T是某种受歧视的联盟,à la Boost Variant .给出了存储要求,否则我会简单地使用 std::vector<std::pair<T, T>> .我想支持的存储 View 是集合(唯一元素)和表(关联数组、唯一键)。前者通过确保设置的唯一性属性很简单,而后者需要处理键和值。

std::vector<T> 上支持关联数组语义, 我目前认为最好的方法是创建 std::vector<std::pair<T, T>> 形式的 View ,并且此 View 将允许我使用 STL 算法来维护所需的属性。这听起来像是一个好策略吗?还有其他想法吗?

相关

如果我有一个遍历每个偶数元素的迭代器 i 和一个遍历每个奇数元素的迭代器 j,Boost 的 zip iterator想到,这将启用 (i,j) 对的迭代。但我的用例略有不同,因为我没有两个单独的容器。

最佳答案

看来Boost的iterator_facade确实是我想要的。这是一个玩具示例(边缘粗糙):

#include <algorithm>
#include <iostream>
#include <vector>
#include <boost/iterator/iterator_facade.hpp>

template <typename Value>
class pair_iterator
  : public boost::iterator_facade<
        pair_iterator<Value>
      , Value
      , boost::random_access_traversal_tag
      , std::pair<Value&, Value&>
      , typename std::vector<Value>::difference_type
    >
{
public:
    typedef std::vector<Value> vector_type;
    typedef typename vector_type::difference_type difference_type;
    typedef typename vector_type::iterator iterator;

    pair_iterator()
        : i_(0)
    {
    }

    explicit pair_iterator(iterator i)
      : i_(i)
    {
    }

private:
    friend class boost::iterator_core_access;

    bool equal(pair_iterator<Value> const& other) const
    {
        return i_ == other.i_;
    }

    void increment()
    {
        ++i_;
        ++i_;
    }

    std::pair<Value&, Value&> dereference() const
    {
        return { std::ref(*i_), std::ref(*(i_ + 1)) };
    }

    void advance(difference_type n)
    {
        i_ += n << 1;
    }

    difference_type distance_to(pair_iterator<Value> const& other) const
    {
        return other.i_ - i_;
    }

    iterator i_;
};

int main()
{
    typedef pair_iterator<int> int_map_iterator;
    std::vector<int> v{2, 20, 3, 30, 5, 50, 7, 70};
    int_map_iterator first(v.begin());
    int_map_iterator last(v.end());

    std::for_each(first + 1, last,
                  [](std::pair<int&, int&> p)
                  {
                      std::cout
                          << p.first << " -> "
                          << p.second << std::endl;
                  });

    return 0;
}

输出是:

3 -> 30
5 -> 50
7 -> 70

问题

  • 本示例尚未解决从 iteratorconst_iterator 的转换。
  • 迭代器仅在基础 vector 大小均匀且需要更保守的 dereference() 实现时才起作用。

关于c++ - vector 的成对迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9765024/

相关文章:

c++ - 从大写字母转换为小写字母,反之亦然

C++ valarray 与 vector

c++ - 在 ANSI C 中定义的结构的 STL 映射

c++ - vector 第一个指针的变化

c++ - emplace_back 和 VC++ 的挫败感

c++ - 尝试使用指向结构 vector 的指针访问结构类型时出错

c++ - Qt 5.7 堆叠条形图在数据更新时自动重新缩放 y 轴

c++ - char* 和 wchar_t* 的区别

C++ 根据限定谓词压缩数组

c++ - 可以将currying与lambda函数一起使用吗?