服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++泛型编程Generic Programming的使用

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

2022-12-13 13:41awhuter C/C++

本文主要介绍了C++泛型编程Generic Programming的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

所谓通用的标准容器库,就是要能够做到,比如用一个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的数组一样,长度固定,声明如下:

?
1
2
3
4
#include<array>
 
//格式array<typename,length> Varname;
array<int, 10> arr;

vector

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

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

deque

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

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

list

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

set集合,只有key

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

map 键值对key/value

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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()
指向最后一个元素的后面的指针

?
1
2
3
4
5
6
7
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()插入

?
1
2
3
4
5
6
7
8
//插入到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()删除

?
1
2
3
4
5
//删除一个元素,返回被删除后,接下来后一个元素的iterator
iterator erase(iterator position);
 
//删除范围内元素[first,last)
iterator erase(iterator first, iterator last);

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

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

copy() 复制

?
1
2
3
4
5
//参数 要复制的  开始  结束,   复制目的地的 开始
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());
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#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++泛型编程内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_41253960/article/details/121972285

延伸 · 阅读

精彩推荐
  • C/C++c语言详解动态内存分配及常见错误的解决

    c语言详解动态内存分配及常见错误的解决

    给数组分配多大的内存空间?你是否和初学C时的我一样,有过这样的疑问。这一期就来聊一聊动态内存的分配,读完这篇文章,你可能对内存的分配有一个...

    平凡的人110082022-11-14
  • C/C++DLL加载设置相对路径的方法

    DLL加载设置相对路径的方法

    这篇文章给大家介绍了DLL加载设置相对路径的方法,非常不错,具有一定的参考借鉴加载,需要的朋友参考下吧...

    qian_tao6282021-06-30
  • C/C++C语言实现简单弹跳小球

    C语言实现简单弹跳小球

    这篇文章主要为大家详细介绍了C语言实现简单弹跳小球,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    无限的菜鸟6812022-11-28
  • C/C++C字符串函数对应的C++ string操作详解

    C字符串函数对应的C++ string操作详解

    在本篇文章里小编给大家整理的是一篇关于C字符串函数对应的C++ string操作知识点内容,有兴趣的朋友们学习下。...

    zzyy_083932021-08-12
  • C/C++C语言项目全正整数后再计算的三种参考解答方法

    C语言项目全正整数后再计算的三种参考解答方法

    今天小编就为大家分享一篇关于C语言项目全正整数后再计算的三种参考解答方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的...

    迂者-贺利坚9092021-07-21
  • C/C++C++遗传算法类文件实例分析

    C++遗传算法类文件实例分析

    这篇文章主要介绍了C++遗传算法的一个类文件,是学习遗传算法的绝佳参考资料,需要的朋友可以参考下...

    C++教程网4502021-01-25
  • C/C++详解C语言中的Static关键字

    详解C语言中的Static关键字

    这篇文章主要为大家介绍了C语言中Static关键字,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助...

    build.code9812022-08-30
  • C/C++C++实现的多重继承功能简单示例

    C++实现的多重继承功能简单示例

    这篇文章主要介绍了C++实现的多重继承功能,结合简单实例形式分析了C++面向对象程序设计中类的定义与继承相关操作实现技巧,需要的朋友可以参考下...

    潜水的飞鱼baby3752021-06-25