我试图将一些Python列表解析(如语法)添加到我的C ++中。 我正在使用Visual Studio 2013。
举个例子,假设我想模拟(python):for i in [1,5]: sum+=i
假设之前初始化的和为零。
我能做的最好的事情是:
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}
有效,但有点刮风;而且我不需要构建和销毁矢量的开销。
我是否遗漏了某些内容,或者在C ++ 11(以及可能是C ++ 14)中这是不可能的?
答案 0 :(得分:5)
您可以使用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;
}
答案 1 :(得分:2)
使用基于范围的for
和braced-init-list
int sum = 0;
for(auto i : {1,2,3,4}) {
sum += i;
}
auto arr = {1,2,3,4};
auto sum = std::accumulate(std::begin(arr), std::end(arr), 0);
答案 2 :(得分:1)
这个怎么样?
#include <iostream>
#include <array>
int main() {
int sum = 0;
for (int x : std::array<int, 2>{1, 5})
sum += x;
}
它保留了长篇大论,但创建阵列的开销很小。