C++ vector 泛型算法笔记

本贴最后更新于 2893 天前,其中的信息可能已经东海扬尘

泛型算法前三节

算法是操作迭代器,算法永远不会执行容器的操作,只会在容器中移动元素但永远不会直接添加和删除元素。

简单的算法复习: count 查找vector里面的 数字多少次 返回 auto result = count(vec.begin(),vec.end(),8); accumulate 求一个vector<int >中的元素之和 int sum = accumulate(vec.begin(),vec.end(),0); 第三个参数说明 加的东西是什么类型,如果vector里面的是string 对象,那么在第三个参数填上""就行了 在泛型算法中,参数很重要,需要明确知道参数的作用,还有重载的参数也好多,需要特别注意。 另外,算法的迭代器参数有可能不是同一个容器的。

特殊的迭代器,插入,流,反向

插入迭代器 insert iterator,可以向一个容器中插入数据

auto it = front_inserter(vec);//从前面插入,必须要支持push_front auto it = back_inserter(vec); //从后面插入 auto it = inserter(vec,vec,begin());//从迭代器位置开始插入 *it = val ; //这样就插入了 等于如下操作: it = vec.insert(it,vec.begin());//插入 it++; //递增it使它指向原来的元素 vector<string> vec{ "happynery","some","fox","school","parsongers for","fox","the","pasenger","sanyuan" }; list<string> lis; sort(vec.begin(), vec.end()); unique_copy(vec.begin(), vec.end(), back_inserter(lis)); for (auto &m : lis) cout << m << endl;

流迭代器:绑定在输入或者输出流上的迭代器;

istream_iterator<int> in(cin); //从CIN读取int istream_iterator<int> eof; //尾部迭代器 vector<int>vec(in,eof); //从流迭代器初始化vector ostream_iterator<int> out_iter(cout, " "); for (auto &e : vec) *out_iter++ = e; // *和++运算符其实对输出流迭代器不做任何事情,这里是为了使其他的使用保持一致; cout << endl; 可以通过调用 copy 来打印vec的内容; copy(vec.begin(),vec.end(),out_iter); cout<<endl; // 使用流迭代器读取一个文本文件,存入一个vector中的string里 ifstream in("shader.vs"); if (!in) { cout << "读取文件失败" << endl; } istream_iterator<string> in_it(in); istream_iterator<string> eof; //高能预警,高级初始化 vector<string> vecStr(in_it,eof); //版本2,循环push_back while(in_it != eof){ vecStr.push_back(*in_it++); } //华丽的分界线 for (auto &elem : vecStr) cout << elem << endl; //使用流迭代器,sort copy 从标准输入读取一个整数序列,将其排序,打印不重复的元素 istream_iterator<int> in_it(cin); istream_iterator<int> eof; vector<int> vecInt(in_it,eof); sort(vecInt.begin(),vecInt.end()); ostream_iterator<int> out(cout, "\n"); unique_copy(vecInt.begin(), vecInt.end(), out); //自己看得懂 int main(int argc,char**argv) { if (argc != 4) { cout << "please in put file name out filename :"; return -1; } ifstream in(argv[1]); istream_iterator<int> in_it(in); istream_iterator<int> eof; ofstream out1(argv[2]); ofstream out2(argv[3]); ostream_iterator<int> out_it1(out1, "\n"); ostream_iterator<int> out_it2(out2, " "); while (in_it != eof) { if (*in_it % 2 == 0) { *out_it1++ = *in_it++; } else { *out_it2++ = *in_it++; } } system("pause"); return 0; }

反向迭代器:向后移动的迭代器;
移动迭代器:专门移动迭代器的迭代器;

#include "stdafx.h" #include <iostream> #include <fstream> #include <string> #include <vector> #include <sstream> #include <list> #include <deque> #include <forward_list> #include <stack> #include <algorithm> #include <functional> using namespace std; void elimDups(vector<string> &words) { //按字典排序 sort(words.begin(), words.end()); //unique 重排输入范围,使得每个单词只出现一次 //排列在范围的前部,返回指向不重复区域之后的一个位置的迭代器 auto end_unique = unique(words.begin(), words.end()); //使用向量操作来删除重复的单词 words.erase(end_unique, words.end()); } bool compare(const string &str1, const string &str2) { return str1.size() > str2.size(); } bool bigsize(const string &str1, string::size_type sz) { return str1.size() >= sz; } string make_plural(size_t ctr, const string &word, const string &ending) { return (ctr > 1) ? word + ending : word; } void biggise(vector<string> &words, vector<string>::size_type sz) { elimDups(words); stable_sort(words.begin(), words.end(), compare); auto wc = find_if(words.begin(), words.end(),bind(bigsize,std::placeholders::_1,sz)); auto count = words.end() - wc; cout << count << " " << make_plural(count, "word", "s") << "of length" << sz << "or longer" << endl; for_each(wc, words.end(), [](const string &s) {cout << s << " "; }); cout << endl; } int main() { vector<string> vec{ "happynery","some","fox","school","parsongers for","fox","the","pasenger","sanyuan" }; biggise(vec,5); system("pause"); return 0; }
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    108 引用 • 153 回帖
  • 基础概念
    1 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 183 关注
  • 浅吟主题

    Jeffrey Chen 制作的思源笔记主题,项目仓库:https://github.com/TCOTC/Whisper

    1 引用 • 31 回帖
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 699 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 88 关注
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 397 关注
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1444 引用 • 10083 回帖 • 507 关注
  • 导航

    各种网址链接、内容导航。

    45 引用 • 177 回帖
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    326 引用 • 1395 回帖 • 3 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 797 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    76 引用 • 258 回帖 • 626 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 281 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 311 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 563 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 712 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 49 关注
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 655 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 766 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    93 引用 • 122 回帖 • 613 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 4 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 445 关注
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖 • 1 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖 • 1 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1708 回帖
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 53 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 51 关注