C++STL 中的线性容器整体/逐元素操作方法 少写80%for循环

本文中示例代码默认已引用 std 命名空间

累加 (std::accumulate)

accumulate(begin, end, init, op)

返回给定区间内元素的累加值与给定初值的和,初值不可省略

可指定求和运算,默认为std::plus

vector<int>vec = {1, 2, 3, 4};
cout<<accumulate(vec.begin(), vec.end(), 0);
//累加, 输出: 10
cout<<accumulate(vec.begin(), vec.end(), 1, bit_xor<int>());
//异或和,输出: 5

运算操作函数对象见 functional 头文件,常用如下

函数对象 含义
multiplies 乘法
bit_xor 按位异或
bit_and 按位与

?

前缀和 (std::partial_sum)

partial_sum(begin, end, res)

计算给定区间的前缀和,存入res (iterator)中,可以直接存入原容器

int a[5] = {1, 2, 3, 4, 5};
partial_sum(a, a+5, a);
// a : {1, 3, 6, 10, 15}

?

递增填充 (std::iota)

iota(begin, end, value)

递增填充给定区间,即

*(d_first)   = value;
*(d_first+1) = ++value;
...

示例:

vector<int>vec;
vec.resize(10);
iota(vec.begin(), vec.end(), 0);
//vec: {0, 1, 2, ..., 9}

?

定值填充 (std::fill)

fill(begin, end, val)

填充给定区间为val

fill_n(begin, n, val)

指定区间起点和长度

?

生成值填充 (std::generate)

generate(begin, end, func)
generate_n(begin, n, func)

使用函数生成给定区间的值

int a[10];
generate(a, a+5, read);

其中 read 函数可以为

int read(){
    int ret;
    scanf("%d", &ret);
    return ret;
}

配合读入优化可以一行代码读取数据,免去写 for 循环了

此外还可以用来随机数填充等等

?

逐元素函数操作 (std::for_each)

for_each(begin, end, func)

对区间内的元素执行一元函数 func

int a[5] = {1, 2, 3, 4, 5};
for_each(a, a+5, [](int &x){ x&=1; });
//a : {1, 0, 1, 0, 1}

感觉非常有用,配合 lambda 比写 for 循环舒服多了,应用场景非常广泛

?

逐元素函数计算 (std::transform)

transform(begin, end, res, func)

对区间内的元素执行一元函数 func ,将返回值存到 res (也是 iterator)中

可以直接存入原容器

int a[5] = {1, 2, 3, 4, 5};
transform(a, a+5, a, [](int x) { return __gcd(x, 2); });
//a : {1, 2, 1, 2, 1}

?

计数与条件计数 (std::count & std::count_if)

count(begin, end, value)

计数区间内值为 value 的元素个数

count_if(begin, end, func)

计数区间内满足条件的元素个数,func 为一元谓词

int a[5] = {1, -1, 2, -2, 3};
cout<<count(a, a+5, 2);
//输出 : 1
cout<<count_if(a, a+5, [](int x) { return x>0; });
//输出 : 3

?

感觉有了这些 STL 几乎就不再用写那种只有一两句循环体的 for 循环了...

原文地址:https://www.cnblogs.com/glowming/p/cppstl.html

时间: 2024-11-24 08:01:03

C++STL 中的线性容器整体/逐元素操作方法 少写80%for循环的相关文章

stl中顺序性容器,关联容器两者粗略解释

什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象,当然这是一个朴素的理解,这种"对象"还包含了一系列处理"其它对象"的方法,因为这些方法在程序的设计上会经常被用到,所以容器也体现了一个好处,就是"容器类是一种对特定代码重用问题的良好的解决方案". 容器还有另一个特点是容器可以自行扩展.在解决问题时

STL中的set容器的一点总结2

http://blog.csdn.net/sunshinewave/article/details/8068326 1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作.vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构的时候,STL按照程序员的使用习惯,以成员函数方式提供的常用操作,如:插入.排序.删除.

【转】 STL中的set容器的一点总结

1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作.vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构的时候,STL按照程序员的使用习惯,以成员函数方式提供的常用操作,如:插入.排序.删除.查找等.让用户在STL使用过程中,并不会感到陌生. 关于set,必须说明的是set关联式容器.set作为一个容器也是

STL中的set容器的一点总结(转)

STL中的set容器的一点总结 1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作.vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构的时候,STL按照程序员的使用习惯,以成员函数方式提供的常用操作,如:插入.排序.删除.查找等.让用户在STL使用过程中,并不会感到陌生. 关于set,必须说明的是set关

Python中怎样计算矩阵按逐元素进行相乘???

1 # 对两个同维矩阵进行逐元素相乘 2 def matElementMul(): 3 a=mat([[1,2,3],[4,5,6]]); 4 b=mat([[2,2,3],[2,4,1]]); 5 c=array(a)*array(b); 6 c=mat(c); 7 return c; 必须先将两个矩阵转化为数组形式,然后进行相乘,最后将数组转化为矩阵: 计算结果: 1 >>> c=matElementMul() 2 >>> c 3 matrix([[ 2, 4, 9

C++ 浅析 STL 中的 list 容器

list - 擅长插入删除的链表 链表对于数组来说就是相反的存在. 数组本身是没有动态增长能力的(程序中也必须又一次开辟内存来实现), 而链表强悍的就是动态增长和删除的能力. 但对于数组强悍的随机訪问能力来说的话,链表却非常弱. list - 是一个双向链表的实现. 为了提供双向遍历的能力,list要比一般的数据单元多出两个指向前后的指针. 这也是没办法的,毕竟如今的PC内存结构就是一个大数组,链表要在不同的环境中实现自己的功能就须要花很多其它空间. list提供了push_back,push_

使用STL中的list容器实现单链表的操作

#include<iostream> #include<list> #include<algorithm> using namespace std; void Print(int &item) { cout<<item<<" "; } int main() { list<int> listintegers; list<int>::iterator listiter; //引入迭代器 //----

[转]正确使用C++ STL中的map容器

先声明:下面的文章是针对windows的用法,因为std::map的erase函数的windows的实现版本是返回一个std::map的迭代器,但是STL标准里面的该函数的返回值确是: map.erase有3个重载:void erase ( iterator position );size_type erase ( const key_type& x );void erase ( iterator first, iterator last ); . 所以下面的代码中的最后一个例子仅仅可以在win

【STL】关于STL中set容器的一些总结

原文链接 关于set,必须说明的是set关联式容器.set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序 1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作.vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构