C++ vector 泛型算法笔记

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

泛型算法前三节

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

简单的算法复习: 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++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖 • 3 关注
  • 基础概念
    1 引用

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    179 引用 • 408 回帖 • 489 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 293 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 653 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 736 关注
  • 职场

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

    127 引用 • 1707 回帖
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    267 引用 • 666 回帖 • 2 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    692 引用 • 535 回帖
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖
  • OkHttp

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

    16 引用 • 6 回帖 • 83 关注
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 585 回帖 • 1 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    108 引用 • 295 回帖
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 354 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 16 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 738 关注
  • Solo

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

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

    1439 引用 • 10067 回帖 • 489 关注
  • 分享

    有什么新发现就分享给大家吧!

    247 引用 • 1794 回帖
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖 • 2 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 7 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 441 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    7 引用 • 69 回帖 • 3 关注
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    10 引用 • 76 回帖 • 1 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 4 关注
  • Gzip

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

    9 引用 • 12 回帖 • 171 关注