如果我有一个容器(vector, list, 等等),其中每个元素是一个 std::pair, 有一个简单的方法来迭代,每个元素的每一对?

std::vector<std::pair<int,int> > a;
a.push_back(std::pair(1,3));
a.push_back(std::pair(2,3));
a.push_back(std::pair(4,2));
a.push_back(std::pair(5,2));
a.push_back(std::pair(1,5));

然后能够迭代的价值:1,3,2,3,4,2,5,2,1,5?

同样,什么类型的函/功能将返回到我的容器(同类型)与平清单的双元件作为上面?

有帮助吗?

解决方案

要扁平化您对容器进入第二容器,你也可以简单地写自己的插件:

template<class C>
struct Inserter {
    std::back_insert_iterator<C> in;
    Inserter(C& c) : in(c) {}
    void operator()(const std::pair<typename C::value_type, typename C::value_type>& p)
    {
        *in++ = p.first;
    *in++ = p.second;
    }
};

template<class C>
Inserter<C> make_inserter(C& c)
{ 
    return Inserter<C>(c); 
}

// usage example:
std::list<int> l;
std::for_each(a.begin(), a.end(), make_inserter(l));

其他提示

你的首先,你必须创建你自己的迭代级,这对一个标志,表示在对位置 container<pair> 迭代

第二,很容易,尽管是作为一般,因为你想(容器的类型相同)你需要一个 typedef模板.这里只是矢量:

template <class V>
std::vector<V> flatten_pairs(std::vector<std::pair<V,V> > const& a) {
  typedef std::vector<std::pair<V,V> > A;
  std::vector<V> ret;
  for (typename A::const_iterator i=a.begin(),e=a.end();i!=e;++i) {
    ret.push_back(i->first);
    ret.push_back(i->second);
  }
  return ret;
}

这里就是你如何伪造一个模板typedef:

template <class C>
struct same_container;

template <class V>
struct same_container<std::vector<V> > {
  template <class W> struct rebind { typedef std::vector<W> type; };
};

template <class V>
struct same_list<std::list<V> > {
  template <class W> struct rebind { typedef std::list<W> type; };
};

template <class C>
typename same_container<C>::rebind<typename C::value_type::first_type>::type
flatten_pairs(C const& a);

根据需要下面的代码将打印所有值:

for ( size_t x = 0; x < a.size(); ++x ) {
    cout << a[x].first << "," << a[x].second << ",";
}

我宁愿比创建自定义的迭代器,这个简单的方法。

有是执行您想要的迭代没有简单的方法,但你可能想看看了boost :: iterator_adaptor库或实现自己的迭代器做到这一点(它不应该太复杂)。然后,在第二个问题,你可以使用std ::副本,新的迭代器适配器。

没有,真的没有对std::pair这样的事情。您可能要考虑使用升压元组来代替。元组是有点像<=>的扩展版本,其允许元件的任意数量(最多一些限制,但通常为至少10),并允许访问的元素类似的载体/阵列,以及(即你可以通过名称或索引)访问的元素。

TR1还包括性病:: TR1 ::元组,这是Boost的元组的一个子集,但如果没有记错,它仍包括你问的名称/索引功能。

编辑:请注意,在两种情况下,索引符号需要编译时常数索引,这样可以不写(运行时间)循环来遍历中的元素一个元组 - 但你可以带着几分元编程做的工作。加速融合包括相当多的支持你所需要的(有些奇怪的巧合,元组是融合库的一部分)。

在某些时候,你需要使用的第一第二的,即使你创建你自己的迭代器类。我不认为有办法摆脱它(至少在可移植的方式)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top