c++中每个可用匿名集合

C++ for each usable with anonymous collections?

本文关键字:集合 c++      更新时间:2023-10-16

我试图得到一些Python列表理解像语法到我的c++。我用的是Visual Studio 2013。

作为一个例子,假设我想模拟(python): for i in [1,5]: sum+=i假设sum先前初始化为零。

到目前为止我能做的最好的是:

int a[]={1,5}, sum=0;
for each (int i in a) sum+=i;

我希望是这样的:

for each (int i in {1,5}) sum+=i;

但是很明显,这不能编译;在{1,5}处插入int或int[]的尝试在我看来是没有帮助的。

使用{1,5}初始化向量:std::vector<int>{1,5}可以工作,但有点风;而且我不需要构造和销毁vector的开销

我错过了什么,还是这在c++ 11(可能还有c++ 14)中是不可能的?

您可以使用std::initializer_list做类似的事情。下面的代码在gcc 4.8.2

上编译
#include <iostream>
int main() {
    int sum = 0;
    for (auto x : {1,5}) sum += x;
    std::cout << sum << std::endl;
}

编辑:如果您想使用范围,而不是硬编码集合,您可以使用以下命令:

template <int L, int H, int... Nums> struct make_seq_impl {
    constexpr std::initializer_list<int> operator()() const {
        return make_seq_impl<L + 1, H, Nums..., L>{}();
    }
};
template <int H, int... Nums> struct make_seq_impl<H, H, Nums...> {
    constexpr std::initializer_list<int> operator()() const {
        return { Nums..., H };
    }
};
template <int L, int H>
inline constexpr std::initializer_list<int> make_seq() {
    return make_seq_impl<L, H>{}();
}
int main() {
    int sum = 0;
    // 1 + 2 + 3 + 4 + 5
    for (auto x : make_seq<1, 5>()) sum += x;
}

您可以使用基于范围的for和带括号的init-list

获得非常相似的语法
int sum = 0;
for(auto i : {1,2,3,4}) {
    sum += i;
}

或者使用std::accumulate

auto arr = {1,2,3,4};
auto sum = std::accumulate(std::begin(arr), std::end(arr), 0);

这个怎么样?

#include <iostream>
#include <array>
int main() {
    int sum = 0;
    for (int x : std::array<int, 2>{1, 5})
        sum += x;
}

它保留了长缠绕性,但是创建数组的开销很小。