本文中示例代码默认已引用 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 循环了...

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

  1. C++ STL 中 map 容器

    C++ STL 中 map 容器 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它 ...

  2. STL中的容器介绍

    STL中的容器主要包括序列容器.关联容器.无序关联容器等. 一]序列容器 (1) vector vector 是数组的一种类表示,提供自动管理内存的功能,除非其他类型容器有更好满足程序的要求,否则,我 ...

  3. [C++]STL中的容器

    C++11 STL中的容器 一.顺序容器: vector:可变大小数组: deque:双端队列: list:双向链表: forward_list:单向链表: array:固定大小数组: string: ...

  4. STL中的容器

    STL中的容器 一. 种类: 标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器slist ...

  5. C++ STL中常见容器的时间复杂度和比较和分析

    C++ STL中常见容器的时间复杂度 map, set, multimap, and multiset 上述四种容器采用红黑树实现,红黑树是平衡二叉树的一种.不同操作的时间复杂度近似为: 插入: O( ...

  6. 算法求解中的变量、数组与数据结构(STL 中的容器)

    本质上算法都是对数据的操作,没有数据,没有存储数据的容器和组织方式,算法就是无源之水无本之木,就是巧妇也难为无米之炊.算法是演员,变量.数组.容器等就是舞台, 然后整个算法的处理流程,都是针对这些数据 ...

  7. STL中常用容器及操作 学习笔记1

    @[TOC](下面介绍STL中常见的容器及操作)## 不定长数组 vector> vetcor:其实就是一个数组或者说是容器 其操作不同于之前直接定义的数组 > 而且可以直接赋值也可以直接 ...

  8. C++STL中map容器的说明和使用技巧(杂谈)

    1.map简介 map是一类关联式容器.它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响.对于迭代器来说,可以修改实值,而不能修改key. 2.map的功能 自 ...

  9. stl中的容器、迭代器和算法----vector中的find实现

    来源 http://blog.csdn.net/huangyimin/article/details/6133650 stl包括容器.迭代器和算法: 容器 用于管理一些相关的数据类型.每种容器都有它的 ...

随机推荐

  1. Hadoop学习之路(七)Hadoop集群shell常用命令

    Hadoop常用命令 启动HDFS集群 [hadoop@hadoop1 ~]$ start-dfs.sh Starting namenodes on [hadoop1] hadoop1: starti ...

  2. Error: Couldn't find preset "env" relative to directory "/Users/user/ethereumjs-vm"

    运行npm run build时遇见这个问题,解决办法是安装: npm install --save-dev babel-preset-env 就解决了

  3. Elasticsearch之如何合理分配索引分片

    大多数ElasticSearch用户在创建索引时通用会问的一个重要问题是:我需要创建多少个分片? 在本文中, 我将介绍在分片分配时的一些权衡以及不同设置带来的性能影响. 如果想搞清晰你的分片策略以及如 ...

  4. dataTable配置项说明

    Datatables是一款jquery表格插件.它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能. 官网地址:https://datatables.net/ 中文说明地址:http:/ ...

  5. redis 基本数据类型-字符串(String)

    不瘦原来对redis也是有个大概的了解(就你知道的多), 但是最近和大神聊天的过程中才明白自己知道的简直就是鸡毛蒜皮(让你得瑟),所以不瘦打算从头在捋一遍,顺便把过程也记录下来,如果能给大家在学习re ...

  6. Hadoop系列-zookeeper基础

    目前是刚刚初学完zookeeper,这篇文章主要是简单的对一些基本的概念进行梳理强化. zookeeper基础概念的理解 有时候计算机领域很多名词都是从一长串英文提取首字母缩写而来,但很不幸zooke ...

  7. 你的程序运行使用了多少CPU,秒知!

    朋友们,相信大家日夜操练,代码已经撸了不少了,在跟代码打交道的时候,大家有没有思考过一个问题,想过你的代码完成一个循环或者处理其它事件它到底花了多少时间吗? “什么,你不是装逼吧,居然还可以知道代码运 ...

  8. 20155217 《信息安全系统设计基础》week16课堂测试

    20155217 <信息安全系统设计基础>week16课堂测试 在作业本上完成附图作业,要认真看题目要求并提交作业截图. 在set的过程中,我们需要将hour部分进行赋值,赋值我们采用&q ...

  9. 20145202马超 2016-2017-2 《Java程序设计》第9周学习总结

    20145202马超 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 JDBC 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交 ...

  10. pythonDjango开发-创建django程序

    1.创建jgango程序 a.命令 cmd命令行下 进入到需要创建项目的路径下 django-admin startproject mysite  创建项目 cd mysite 进入项目文件夹 pyt ...