C++泛型编程Generic Programming的使用

目录
  • 一、容器
    • array
    • vector
    • deque
    • list
    • map 键值对key/value
  • 二、迭代器iterator(泛型指针)
  • 三、泛型算法Generic Programming
    • insert()插入
    • erase()删除
    • find()用于无序搜索,搜素范围[first, last), 返回iterator, 找不到则返回last
    • copy() 复制

泛型编程最初提出时的动机很简单直接:发明一种语言机制,能够帮助实现一个通用的标准容器库。

所谓通用的标准容器库,就是要能够做到,比如用一个List类存放所有可能类型的对象这样的事;

泛型编程让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同。

泛型即是指具有在多种数据类型上皆可操作的含义,与模板有些相似。

STL巨大,而且可以扩充,它包含很多计算机基本算法和数据结构,而且将算法与数据结构完全分离,其中算法是泛型的,不与任何特定数据结构或对象类型系在一起。(STL是Standard Template Library的简称,中文名标准模板库)

泛型编程最初诞生于C++中,目的是为了实现C++的STL(标准模板库)。其语言支持机制就是模板(Templates)。模板的精神其实很简单:参数化类型。换句话说,把一个原本特定于某个类型的算法或类当中的类型信息抽掉,抽出来做成模板参数T。

泛型编程Cgencric programming)是 C++支持的另一种编程模式。它与OOP的目标相同,即使重用代码和抽象通用概念的技术更简单。不过OOP强调的是编程的数据方面,而泛型编程强调的是独立于特定数据类型,它们的侧重点不同.OOP是一个管理大型项目的工具,而泛型编程提供了执行常见任务(如对数据排序或合并链表)的工具。

术语泛型(generic)指的是创建独立于类型的代码。C++的数据表示有多种类型—整数、小数、字符、字符串、用户定义的、由多种类型组成的复合结构,例如,要对不同类型的数据进行排序,通常必须为每种类型创建一个排序函数,泛型编程需要对语言进行扩展,以便可以只编写一个泛型(即不是特定类型的)函数,并将其用于各种实际类型。C++模板提供了完成这种任务的机制。
 C++的标准模板库(STL)主要由三个组件构成:1、容器;2、迭代器;3、泛型算法

一、容器

对容器的通用型操作:

  • "==", "!="判断两个容器是否相等
  • "="将一个容器复制给另一个容器
  • .empty()判断是不是空的,有没有元素
  • .size() 返回容器内元素的个数
  • .clear() 删除容器内所有元素

array

数组array,最一般的数组,和C的数组一样,长度固定,声明如下:

#include<array>

//格式array<typename,length> Varname;
array<int, 10> arr;

vector

vector,相当于动态数组,用的最多最方便,长度可以随时扩充:

#include<vector>
//格式vector<typename> Varname;
vector<double> Vet;
vector<int> Vet1(10);
Vet1.push_back(5);//后端插入
Vet1.pop_back();//后端删除

deque

也是个线性表,和vector类似,不过是双向的,可以在前端插入和删除

#include<deque>
deque<double> Var1;
Var1.push_front(6);//前端插入
Var1.pop_front();//前端删除

list

双向链表,不是线性表,存储的内容不是在连续的内存上,每个节点都有一个value和两个指针back, front分别只想前面和后面的节点;

set集合,只有key

#include<set>
#include<string>
set<string> word_set;
word_set.count(key);//返回个数,要么0,要么1

map 键值对key/value

key通常是字符串,相当于索引;
有.find(key)成员函数,返回查找的key的iterator,否则返回map.end()

#include<iostream>
#include<map>
#include<string>
using namespace std;
int main()
{
 map<string,int> words;
 string word;
 //统计输入每种字符的个数,map中没有的会自动创建
 while(cin>>word)
  words[word]++;
 map<string,int>::iterator it=words.begin()
 //依次打印map中的内容,first成员对应key,second成员对应value
 for(;it!=words.end();it++)
  cout<<"key: "it->first<<" value: "<<it->second<<endl;
 return 0;
}

二、迭代器iterator(泛型指针)

类似于指针,作用于容器类上

.begin()
相当与头指针,指向第一个元素的指针

.end()
指向最后一个元素的后面的指针

vector<int> Var{4,5,7,8};
vector<int>::iterator head=Var.begin();
vector<int>::iterator tail=Var.end();
for(;head!=tail;head++)  //遍历容器类
{
 cout<<*head<<endl;
}

三、泛型算法Generic Programming

insert()插入

//插入到position之前一个元素,返回被插入的元素的iterator
iterator insert(itrator position, elemType value);

//插入count个值
void insert(iterator position, int count, elemType value);

//插入[first,last)之间的元素
void insert(iterator position, iterator first, iterator last);

erase()删除

//删除一个元素,返回被删除后,接下来后一个元素的iterator
iterator erase(iterator position);

//删除范围内元素[first,last)
iterator erase(iterator first, iterator last);

find()用于无序搜索,搜素范围[first, last), 返回iterator, 找不到则返回last

iterator find(iterator first, iterator last, elemType findvalue);

copy() 复制

//参数 要复制的  开始  结束,   复制目的地的 开始
copy(iterator first, iterator last, iterator To_first);
vector<int> ivet;
vector<int> temp{1,2,3,4,5};
copy(temp.begin(), temp.end(), ivec.begin());
#include<vector>
#include<deque>
#include<list>
#include<string>
using namespace std;
int main()
{
 //产生空的容器
 list<string> slist;
 vector<int> ivec;

 //产生特定大小的容器
 list<int> ilist(100);
 vector<string> svec(32);

 //产生特定大小的容器,并赋值全相同的初值
 vector<int> ivec(10,1);  //10个1
 list<string> slist(16,"WoW");

 //通过两个迭代器iterator赋值
 int arr[8]={1,1,2,2,3,5,6,4};
 vector<int> ivec1(ia,ia+8); //赋值[ia,ia+8)之间的内容
 int a=ivec1.front();//读取第一个元素
 a=ivec1.back(); //读取最后一个元素
 ivec1.push_back(10); //在最后插入元素
 ivec1.pop_back(); //删除最后一个元素

 //复制容器赋值
 list<string> slist1(5,"wfq");
 list<string> slist2(slist1);  //复制赋值
 return 0;
}

到此这篇关于C++泛型编程Generic Programming的使用的文章就介绍到这了,更多相关C++泛型编程内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ 泛型编程详解

    泛型编程与面向对象编程的目标相同,即使重用代码和抽象通用概念的技术更加简单.但是面向对象编程强调编程的数据方面,泛型编程强调的是独立于特定数据类型. 这一篇介绍一下 C++ 编程中与面向对象并列的另一大分支--泛型编程,这一篇主要介绍函数模板.类模板和成员模板三大部分 如有侵权,请联系删除,如有错误,欢迎大家指正,谢谢 泛型编程 模板是泛型编程的一种重要思想,STL(Standard Template Library,标准模板库)是采用模板实现的一个实例 函数模板 对比函数重载(同一作用域内函数

  • C++泛型编程基本概念详解

    目录 1.什么是泛型编程? 2.函数模板 (1)函数模板概念 (2)函数模板格式 (3)函数模板的原理 (4)函数模板的实例化 (5)模板参数的匹配原则 3.类模板 (1)类模板的定义格式 (2)类模板的实例化 总结 1.什么是泛型编程? 比如说,我们如何实现一个通用的交换函数呢?int型.double型.char型的交换 void Swap(int& left, int& right) { int temp = left; left = right; right = temp; } vo

  • C++泛型编程Generic Programming的使用

    目录 一.容器 array vector deque list map 键值对key/value 二.迭代器iterator(泛型指针) 三.泛型算法Generic Programming insert()插入 erase()删除 find()用于无序搜索,搜素范围[first, last), 返回iterator, 找不到则返回last copy() 复制 泛型编程最初提出时的动机很简单直接:发明一种语言机制,能够帮助实现一个通用的标准容器库. 所谓通用的标准容器库,就是要能够做到,比如用一个

  • C语言的模板与泛型编程你了解吗

    目录 模板与泛型编程浅谈 摘要(Effective C++): 模板与泛型编程简单介绍 函数模板 模板编译 类模板 为什么我们需要模板特例化? 总结 模板与泛型编程浅谈 摘要(Effective C++): ​ C++template的最初发展动机很直接:让我们得以建立“类型安全”的容器如vector,list和map.然而当愈多人用上templates时,他们发现template有能力完成愈多可能的变化.容器当然很好,但泛型编程(generic programming)——写出的代码和其所处理

  • 浅谈Go1.18中的泛型编程

    目录 前言 以前的Go泛型 泛型是什么 Go的泛型 泛型函数 泛型类型 类型集合 和接口的差异 总结 前言 经过这几年的千呼万唤,简洁的Go语言终于在1.18版本迎来泛型编程.作为一门已经有了14年历史的强类型语言,很难相信它到现在才开始有一个正式的泛型. 以前的Go泛型 虽然直到1.18版本才加入泛型,但是在2014年便有相关的讨论要在Go中加入泛型设计.但是由于各种原因没有实现.而之后的接口(interface)的提出,让泛型进一步搁置.但是由于接口的缺陷,最终Go团队还是在1.18的版本中

  • C++函数模板与类模板实例解析

    本文针对C++函数模板与类模板进行了较为详尽的实例解析,有助于帮助读者加深对C++函数模板与类模板的理解.具体内容如下: 泛型编程(Generic Programming)是一种编程范式,通过将类型参数化来实现在同一份代码上操作多种数据类型,泛型是一般化并可重复使用的意思.泛型编程最初诞生于C++中,目的是为了实现C++的STL(标准模板库). 模板(template)是泛型编程的基础,一个模板就是一个创建类或函数的蓝图或公式.例如,当使用一个vector这样的泛型类型或者find这样的泛型函数

  • Java程序员需要掌握的英语词组

    本文为大家分享了Java程序员必须掌握的英语词组,供大家参考,具体内容如下 抽象类(abstract class):抽象类不能创建对象,主要用来创建子类.Java中的抽象类使用 abstract 修饰符定义. 抽象数据类型(abstract data type ADT):抽象数据类型指明了可能的类型和允许进行的操作,但是没有提供实现. 访问标识符(access specifier):用于方法或变量定义,限定了哪些类可以访问该方法或变量.Java中的访问标识符有 public.protected

  • 简述C++的复杂性

    1. C++真的很复杂吗 这个问题的答案是肯定的.从C++语言本身的发展和组成来看,C++语言并不是一种单一."纯粹"的编程语言,他有着复杂的内部结构. 最初,C++仅仅是在C的基础上附加了一些object-oriented(面向对象)的特性.C++最初的名字是"C with Class".以后C++不断的创新和发展,融入了procedural(过程化),object-oriented(面向对象),functional(函数化),generic(泛型)以及metap

  • c++编程学习的技巧总结

    1.把C++当成一门新的语言学习(和C没啥关系). 2.看<Thinking In C++>,不要看<C++编程思想>. 3.看<The C++ Programming Language>和<Inside The C++ Object Model>,不要因为他们很难而我们自己是初学者所以就不看. 4.不要被VC.BCB.BC.MC.TC等词汇所迷惑–他们都是集成开发环境,而我们要学的是一门语言. 5.不要放过任何一个看上去很简单的小编程问题--他们往往并不那

  • 前端深入理解Typescript泛型概念

    首先介绍一下泛性的概念 泛型程序设计(generic programming)是程序设计语言的一种风格或范式.泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型. 泛型是指在定义函数,接口或者类的时候,不预先定义好具体的类型,而在使用的时候在指定类型的一种特性. 先举一个简单的例子 假设我们定义一个函数,它可以接收一个number类型做为参数,并且返回一个number类型. function genericDemo(data: number):

  • Java泛型机制必要性及原理解析

    泛型程序设计(Generic Programming) "使用泛型机制编写的程序代码要比那些杂乱地使用Object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性.泛型对于集合类尤其有用." 1.意义.必要性.重要性 泛型程序设计 意味着编写的代码可以被很多不同类型的对象所重用.例如,我们并不希望为聚集String和File对象分别设计不同的类.实际上,也不需要这样做,因为一个ArrayList类就可以聚集任何类型的对象.这是一个泛型程序设计的实例. 事实上,在Java增加泛

  • java伪泛型知识点详解

    说明 1.Java中的泛型是伪泛型.这种泛型实现方法称为类型擦除 ,基于这种方法实现的泛型称为伪泛型. 2.由于Java的泛型只在编译阶段发挥作用,因此在写代码时,起到了检查的作用,当代码运行时,它的内部并没有泛型. 实例 List<String> l1 = new ArrayList<String>(); List<Integer> l2 = new ArrayList<Integer>(); System.out.println(l1.getClass(

随机推荐