Exc*_*bur 12 c++ iterator c++11
我需要一个针对以下情况的建议 - 我几个小时都无法弄明白:如何通过多个seq.容器大小相同(这里:两个向量)的简单方法?
int main() {
int size = 3;
std::vector<int> v1{ 1, 2, 3 }, v2{ 6, 4, 2 };
// old-fashioned - ok
for (int i = 0; i < size; i++) {
std::cout << v1[i] << " " << v2[i] << std::endl;
}
// would like to do the same as above with auto range-for loop
// something like this - which would be fine for ONE vector.
// But this does not work. Do I need a hand-made iterator instead?
for (const auto& i:v1,v2) {
std::cout << i << " " << i << std::endl;
}
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
Tem*_*Rex 15
有boost::combine()在Boost.Range允许一个写
#include <iostream>
#include <iterator>
#include <vector>
#include <boost/range/combine.hpp>
int main()
{
std::vector<int> v1{ 1, 2, 3 }, v2{ 6, 4, 2 };
for (auto&& t : boost::combine(v1, v2))
std::cout << t.get<0>() << " " << t.get<1>() << "\n";
}
Run Code Online (Sandbox Code Playgroud)
实例.
如果你不喜欢依靠这一点,你可以拼出combine()自己与功能Boost.Iterator的zip_iterator和Boost.Range的iterator_range和C++ 14推导返回类型一点点:
template<class... Ranges>
auto combine(Ranges const&... ranges)
// add -> decltype( boost::make_iterator_range(...) ) in C++11
{
return boost::make_iterator_range(
boost::make_zip_iterator(boost::make_tuple(begin(ranges)...)),
boost::make_zip_iterator(boost::make_tuple(end(ranges)...))
);
}
Run Code Online (Sandbox Code Playgroud)
实例.
说明:在输入范围中boost::make_zip_iterator创建一个boost::tuple迭代器,并从常规迭代器中重载所有常用的operator++以及operator*您熟悉和喜爱的内容.所述iterator_range然后包装两种这些的zip_iterators转换与一个包begin()和end()功能,允许它由C++ 11范围-for循环中使用.它也推广到两个以上的输入范围.您可以K使用.get<K>成员函数从元组中解压缩-th元素.
Rei*_*ica 14
基于范围的for循环被设计为迭代一个范围的便利,因为它是迄今为止最常见的情况.如果您需要迭代多个范围(这不是最常见的情况),您仍然可以采用传统方式:
for (auto i1 = begin(v1), i2 = begin(v2), e = end(v1); i1 != e; ++i1, ++i2)
{
// processing
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4088 次 |
| 最近记录: |