1

我对 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

4 回答 4

3

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

你也可以尝试实现一个更简单的版本(完整的实现相当复杂)。

于 2013-04-30T10:03:41.670 回答
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;
}
于 2013-04-30T09:58:57.737 回答
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 个)迭代器,或者使用可变参数模板概括上述内容。

于 2013-04-30T10:27:34.050 回答
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;

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

于 2013-04-30T10:01:17.683 回答