如果您想同时BOOST_FOREACH
迭代两个向量,就像您在示例代码中所做的那样,那么您必须将两个向量封装在一个应该公开begin
和end
函数的包装类中。这些函数返回自定义迭代器以用于迭代包装器,该包装器在内部将迭代两个向量。听起来不太好,但这是你必须做的。
这是我第一次尝试实现这个(最小实现只是为了展示基本思想):
template<typename T>
struct wrapper
{
struct iterator
{
typedef typename std::vector<T>::iterator It;
It it1, it2;
iterator(It it1, It it2) : it1(it1), it2(it2) {}
iterator & operator++()
{
++it1; ++it2; return *this;
}
iterator & operator *()
{
return *this;
}
bool operator == (const iterator &other)
{
return !(*this != other);
}
bool operator != (const iterator &other)
{
return it1 != other.it1 && it2 != other.it2;
}
};
iterator begin_, end_;
wrapper(std::vector<T> &v1, std::vector<T> &v2)
: begin_(v1.begin(), v2.begin()),end_(v1.end(), v2.end())
{
}
wrapper(const wrapper & other) : begin_(other.begin_), end_(other.end_) {}
iterator begin()
{
return begin_;
}
iterator end()
{
return end_;
}
};
以下是测试代码。因为它使用通常的for
循环,因为 ideone 没有为 C++0x 安装 boost 或者我在包含它时做错了什么。
int main() {
std::vector<int> v1 = {1,2,3,4,5,6};
std::vector<int> v2 = {11,12,13,14,15};
wrapper<int> w(v1,v2);
for(wrapper<int>::iterator it = w.begin(); it != w.end(); ++it)
{
std::cout << *it.it1 <<", "<< *it.it2 << std::endl;
}
return 0;
}
输出:
1, 11
2, 12
3, 13
4, 14
5, 15
演示:http: //ideone.com/Hf667
这仅适用于实验和学习目的,因为我并不认为它是完美的。可以有很多改进。@Steve 已经发布了 boost 的解决方案。