c++中每个可用匿名集合
C++ for each usable with anonymous collections?
我试图得到一些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;
}
它保留了长缠绕性,但是创建数组的开销很小。
相关文章:
- 处理多个异常集合的C++方法
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- 如何将ampl中的集合表示为c++中的向量
- 检查值是否在集合p1和p2中,但不在p3中
- 带过滤器的现代迭代c++集合
- 如何将结构插入到集合中并打印集合的成员
- 集合上的输出迭代器:assign和increment迭代器
- 如何将函数集合传递给客户端类,以便将它们当作客户端类本身的成员使用
- 实现一个在集合上迭代的模板函数
- 尝试使用集合函数时出现分段错误
- 互斥指针的集合
- c++找不到具有相同哈希的无序集合元素
- python集合的C++等价物是什么.计数器
- 如何在C++中递归地按相反顺序打印集合
- Python 集合.计数器,如何避免重复查找
- 如何写向量的无序向量集,即unordered_set<向量<向量<int>>集合?
- 从具有自定义排序的向量创建集合
- 显示字符串的集合和子集
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 有没有办法在 c++ 中按更大的 int 和更小的对对 int 和对的集合进行排序?