gpt4 book ai didi

c++ - 嵌套 c++11 范围循环以查找组合

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:19:31 25 4
gpt4 key购买 nike

查找组合涉及同一容器上的两个循环。

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.Range 的帮助下执行以下操作:

for(auto i: boost::irange(0, v.size()))
for(auto j: boost::irange(0, i)) {
// use v[i] and v[j]
}

除了示例之外,您的问题的答案是不,range-for 语句并没有太大的魔力。它也是不可扩展的。然而,好消息是还有另一种方式来看待它:range-for 语句可能非常愚蠢,但范围可以随心所欲地变得聪明。

这意味着虽然 range-for 可能只能迭代范围内的元素,但该范围没有例如映射到实际的现有容器,这与您似乎期望的相反。比如这个

namespace A = boost::adaptors;
for(auto&& e: A::strided(v, 2)) foo(e);

电话 foov 的所有其他元素上.这里的工作由 strided 完成,而不是 range-for 语句。

即使借助 Boost.Range,我也想不出一种简洁的方式来仅在一个范围内表达您的示例。但这并不意味着它是不可能的,而且我过去确实研究过 C++ 中某种形式的列表理解。然而,表达它的工具今天并不存在。

关于c++ - 嵌套 c++11 范围循环以查找组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12497139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com