C++ vector 泛型算法笔记

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

泛型算法前三节

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

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

    106 引用 • 152 回帖
  • 基础概念
    1 引用

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 45 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 451 关注
  • Vue.js

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

    261 引用 • 662 回帖
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    89 引用 • 113 回帖 • 1 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    85 引用 • 895 回帖
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 60 回帖 • 462 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    51 引用 • 190 回帖
  • RabbitMQ

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

    49 引用 • 60 回帖 • 394 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    16 引用 • 53 回帖 • 121 关注
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    21 引用 • 140 回帖 • 30 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    140 引用 • 441 回帖
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    396 引用 • 3416 回帖
  • wolai

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

    1 引用 • 11 回帖 • 2 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 49 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 88 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    40 引用 • 40 回帖 • 1 关注
  • GraphQL

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

    4 引用 • 3 回帖 • 22 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    523 引用 • 4581 回帖 • 693 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 622 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    5 引用 • 13 回帖
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 245 关注
  • JWT

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

    20 引用 • 15 回帖 • 18 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    915 引用 • 931 回帖 • 1 关注
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 593 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    492 引用 • 1383 回帖 • 370 关注