kir*_*gum 1 c++ combinations iterator for-loop c++11
查找组合涉及同一容器上的两个循环.
the first iterates over elements:
pick an element
iterate over the elements on the left
print the first and the second iterated elements
Run Code Online (Sandbox Code Playgroud)
所以这是一个错误的例子:
vector<int> vec;
for(size_t i=0; i< 10 ; ++i) vec.push_back(i);
for(auto i : vec)
{
auto j = i.increaseBy(1);
for(j : vec) cout << i << j << "\n";
}
Run Code Online (Sandbox Code Playgroud)
在这个问题中,我感兴趣的是,范围循环的语法还有更多,只是迭代元素的简单方法.关于c ++ 11的文档不多.
假设您想要迭代[(v[i], v[j]) | i <- [0..v.size()], j <- [0..i]](使用带有列表推导语法的伪代码),那么您可以在Boost.Range的帮助下执行以下操作:
for(auto i: boost::irange(0, v.size()))
for(auto j: boost::irange(0, i)) {
// use v[i] and v[j]
}
Run Code Online (Sandbox Code Playgroud)
但是,除了这个例子之外,你的问题的答案是否定的,范围for语句没有太大的魔力.它也不可扩展.然而,好消息是还有另一种方式来看待它:范围 - 声明可能非常愚蠢,但范围可以让它们变得像他们想要的那样聪明.
这意味着虽然range-for可能只能迭代范围的元素,但该范围不具有例如映射到实际的现有容器,与您期望的相反.例如,这个
namespace A = boost::adaptors;
for(auto&& e: A::strided(v, 2)) foo(e);
Run Code Online (Sandbox Code Playgroud)
呼吁foo其他所有元素v.这项工作在这里完成strided,而不是范围陈述.
即使在Boost.Range的帮助下,我也想不出简单的方式在一个范围内表达你的例子.这并不意味着它是不可能的,我过去曾在C++中调查某种形式的列表理解.然而,表达它的工具今天不在这里.
我猜你想要的是一组向量元素对。
这不是基于范围的循环的用途。基于范围的循环用于遍历整个集合,只查看每个元素一次。不要将它们用于其他任何用途。仅仅因为它是一个新的、添加的语言功能并不意味着你必须扔掉你曾经知道的一切。新功能丰富了语言,而不是取代它。
以下是获取唯一对的方法:
for (auto it1 = vec.begin(), end = vec.end(); it1 != end; ++it1)
{
for (auto it2 = std::next(it1); it2 != end; ++it2)
{
std::cout << "[" << *it1 << ", " << *it2 << "]\n";
}
}
Run Code Online (Sandbox Code Playgroud)
如果您还想包括对角元素 ( it1, it1),只需将第二个初始化替换为auto it2 = it1。