嵌套c++11范围循环,用于查找组合
nesting c++11 range loops for finding combinations
查找组合涉及同一容器上的两个循环。
the first iterates over elements:
pick an element
iterate over the elements on the left
print the first and the second iterated elements
所以这里有一个错误的例子:
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";
}
在这个问题中,我感兴趣的是,范围循环的语法是否不仅仅是迭代元素的简单方法。关于c++11的文档不多。
假设您想迭代[(v[i], v[j]) | i <- [0..v.size()], j <- [0..i]]
(使用具有列表理解语法的伪代码),那么您可以在Boost的帮助下完成以下操作。范围:
for(auto i: boost::irange(0, v.size()))
for(auto j: boost::irange(0, i)) {
// use v[i] and v[j]
}
不过,除了这个例子之外,你的问题的答案是不,语句的范围并没有太大的魔力。它也不可扩展。然而,好消息是,还有另一种方法可以看待它:语句的范围可能相当愚蠢,但范围可以随心所欲地智能。
这意味着,虽然的范围可能只能在范围的元素上迭代,但该范围不必映射到实际的现有容器,这与您的预期相反。例如,这个
namespace A = boost::adaptors;
for(auto&& e: A::strided(v, 2)) foo(e);
在CCD_ 3的每隔一个元素上调用CCD_。这里的工作是由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";
}
}
如果还想包含对角线元素(it1, it1
),只需将第二次初始化替换为auto it2 = it1
即可。
相关文章:
- 一个函数,用于查找字符串1包含字符串2 c++的次数
- C++ 函数,用于查找传入的 N 个数字的平均值、总和、最小值和最大值
- 这种用于查找连续子数组中最大和的递归算法有什么优势吗?
- 用于查找网格中最短路径的算法
- 用于查找数组中最大元素的出现次数的代码,给出分段错误
- C++ 函数,用于查找数组中四个最小最大元素的总和不起作用
- 用于查找最低共同祖先的代码不适用于某些测试用例
- 递归函数,用于查找 2 个整数之间的最大值
- 用于查找连续子数组的最大总和的代码使测试用例失败
- 用于查找元素的数据结构
- 如何编写用于查找数组中一系列元素的函数?
- 用于查找ABS的最小值的算法(A [I] A [J] -K)
- 大 O 表示用于查找素数的算法
- 提升正则表达式 cpp 用于查找 %% 之间的字符串,输出不包括 % 字符本身
- 用于查找范围重叠的更节省内存的算法
- 我的递归算法中的问题,用于查找所有最短、唯一的路径
- 算法,用于查找获取排序列表所需的最小移动元素到结束步骤
- 激活记录是否用于查找错误行
- 编写一个 c++ 程序,用于查找字符串中使用的元音数
- 用于查找数组的独特成员的算法