在c ++中组合来自许多容器的输出

时间:2013-04-30 09:57:11

标签: c++ iterator

我对C ++中的迭代器不是很熟悉。基本上我有一个容器,由其他人编写,我用记录填充(我创建了许多容器)。但是,我需要输出元组,而不是单独输出每个容器,例如:

a1 | a2 | ...... |一个

鉴于每个a都属于不同的容器。我将把它作为一个矢量容器:

vector<int> v;
vector<int>::iterator iter;

v.push_back(1);
v.push_back(2);
v.push_back(3);

for (iter = v.begin(); iter != v.end(); iter++)
  cout << (*iter) << endl;

上面的代码只会从一个容器输出记录,但是我需要组合来自许多容器的输出(所有长度相同),我将如何继续构建所有容器的元组?

提前完成!

4 个答案:

答案 0 :(得分:3)

如果您的项目已经使用了Boost,则可以使用zip_iterator

您也可以尝试实现它的更简单版本(完整的实现非常复杂)。

答案 1 :(得分:2)

如果容器支持indices,则可以使用random-access,例如

for (size_t i = 0; i < v.size(); ++i)
{
   cout << v[i] << " " << v1[i] << endl;
}

您可以使用许多迭代器

vector<int>::iterator iter1;
for (iter = v.begin(), iter1 = v1.begin(); iter != v.end(); ++iter, ++iter1)
{
   cout << *iter << " " << *iter1 << endl;
}

答案 2 :(得分:0)

vector<int> v;
set<float> v2;
vector<int>::iterator iter;
set<float>::iterator iter2;

for (iter = v.begin(), iter2 = v2.begin(); 
           iter != v.end() && iter2 != v2.end();
           ++iter, ++iter2)
  cout << (*iter) << (*iter2) << endl;

请记住,此循环最多迭代与最小容器的长度

答案 3 :(得分:0)

除了pmr的回答以及你对此寻求指向实现的评论之外,“压缩”迭代器的基本思想很容易实现:

#include <iostream>
#include <vector>

template <typename T, typename U>
struct Zip
{
    Zip(const T& t, const U& u, char sep = '|')
      : it_(t.begin()), iu_(u.begin()), te_(t.end()), ue_(u.end()), sep_(sep)
    { }

    Zip& operator*() const { return *this; }

    Zip& operator++() { ++it_; ++iu_; return *this; }

    operator bool() const { return it_ != te_ && iu_ != ue_; }

    friend std::ostream& operator<<(std::ostream& os, const Zip& z)
    {
        return os << *z.it_ << z.sep_ << *z.iu_;
    }

  private:
    typename T::const_iterator it_, te_;
    typename U::const_iterator iu_, ue_;
    char sep_;
};

int main()
{
    std::vector<int> v1;
    v1.push_back(1);
    v1.push_back(2);
    v1.push_back(3);
    v1.push_back(4);

    std::vector<std::string> v2;
    v2.push_back("one");
    v2.push_back("two");
    v2.push_back("three");
    v2.push_back("four");

    for (Zip<std::vector<int>, std::vector<std::string> > zip(v1, v2); zip; ++zip)
        std::cout << zip << '\n';
}

您可以创建一个Zip迭代器,其中一侧/两侧是Zip迭代器,以处理更多(超过2个)迭代器,或使用可变参数模板对上述内容进行概括。