问题提要
给定一个 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
问题
- 本示例尚未解决从
iterator
到const_iterator
的转换。 - 迭代器仅在基础 vector 大小均匀且需要更保守的
dereference()
实现时才起作用。
关于c++ - vector 的成对迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9765024/