Если вы хотите использовать 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 не установлен для boost для C ++ 0x, или я делаю что-то не так, когда включаю его.
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.