我对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;
上面的代码只会从一个容器输出记录,但是我需要组合来自许多容器的输出(所有长度相同),我将如何继续构建所有容器的元组?
提前完成!
答案 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个)迭代器,或使用可变参数模板对上述内容进行概括。