C++ 模板和泛型编程(掌握Vector等容器的使用)
1. 泛型
泛型在我的理解里,就是可以泛化到多种基本的数据类型,例如整数、浮点数、字符和布尔类型以及自己定义的结构体。而容器就是提供能够填充任意类型的数据的数据结构。例如vector就很类似于python中的list。
#include <iostream>
using namespace std;
template <class T> // 模板 T min(T a[], int n)
{
int i;
T minv = a[0];
for (i = 1; i < n; i++) // n-1次
{
// n为数组长
if (minv > a[i])
{
minv = a[i];
}
} return minv;
} int main()
{
int a[] = {8, 10, 0, 1, 7, 4, 9, 6, 11};
double b[] = {1.2, -3.4, 6.9, 7.2, 8.9}; cout << "a数组的最小值为:" << min(a, 9) << endl;
cout << "b数组的最小值为:" << min(b, 5) << endl; return 0;
}
2. 容器
Vector支持push、pop等操作
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector <int> v1;
v1.push_back(1);
v1.push_back(2); //迭代器
v1.insert(v1.begin(), 0);//头部插入
v1.insert(v1.end(), 4); //尾部插入
v1.insert(v1.end()-1, 3);//倒数第二位置
v1[4] = 10; //v1[5] = 6;越界错误
for (int i=0; i<v1.size(); i++) {
cout << v1[i] << ' ';
}
cout << endl; v1.pop_back(); //删除尾部 10
v1.erase(v1.begin()); //删除头 0
v1.erase(v1.begin(), v1.end()); //全删
cout << "全删后:"; // v1.clear();
for (int i=0; i<v1.size(); i++) {
cout << v1[i] << ' ';
} vector <string> v;
v.push_back("food");
v.push_back("candy");
v.push_back("apple");
sort(v.begin(), v.end());
vector <string>::iterator it; //迭代器
for (it=v.begin(); it!=v.end(); it++) {
cout << *it << " ";
}
cout << endl; return 0;
}
#include <string.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std; int main()
{
vector<int> obj; //创建一个向量存储容器 int(定义了一系列操作的动态数组 for (int i=0; i<20; i++) // push_back(elem)在数组最后添加数据
{
obj.push_back(i);
cout << obj[i] << ",";
} cout << "\nmax_size:" << obj.max_size() << ",";
cout << "\ncapacity:" << obj.capacity() << ",";
cout << "\nsize:" << obj.size() << ",";
cout << "\nempty:" << obj.empty() << ","; for (int i=0; i<5; i++) //去掉数组最后一个数据
{
obj.pop_back();
}
obj.push_back(10);
obj.push_back(30); reverse(obj.begin(), obj.end()); //从大到小
cout << "\n从大到小 :" << endl;
for (int i=0; i<obj.size(); i++)
{
cout << obj[i] << ",";
}
cout << "\n" << endl; cout << "从小到大:" << endl;
sort(obj.begin(), obj.end()); //从小到大
for (int i=0; i<obj.size(); i++)
{
cout << obj[i] << ",";
} cout << "\n清除容器:" << endl;
obj.clear(); //清除容器中所以数据
for (int i=0; i<obj.size(); i++)
{
cout << obj[i] << endl;
} cout<<"\n"<<endl;
cout << "实际数据个数 :" << endl;
for (int i=0; i<obj.size(); i++) //size()容器中实际数据个数
{
cout << obj[i] << ",";
} //方法一
obj.push_back(112);
obj.push_back(120);
obj.push_back(112);
cout << "直接利用数组:";
for (int i=0; i<obj.size(); i++)
{
cout << obj[i] << " ";
}
cout << ", obj[2]=" << obj[2]; cout<<endl;
cout<<"利用迭代器:" ;
//方法二,使用迭代器将容器中数据输出(就是指针)
vector<int>::iterator it;//声明一个迭代器,来访问vector容器,作用:遍历或者指向vector容器的元素
for( it=obj.begin(); it != obj.end(); it++)
{
cout << *it << " ";
}
return 0;
}
3. 使用模板实现泛型类型的函数和类
/* 使用模板实现泛型类型的函数和类 */
#include <iostream>
#include <vector>
#include <cstdlib>
#include <string>
#include <stdexcept> using namespace std; template <class T>
class Stack {
private:
vector<T> elems; // 元素 public:
void push(T const&); // 入栈
void pop(); // 出栈
T top() const; // 返回栈顶元素
bool empty() const{ // 如果为空则返回真。
return elems.empty();
}
}; template <class T>
void Stack<T>::push (T const& elem)
{
// 追加传入元素的副本
elems.push_back(elem);
} template <class T>
void Stack<T>::pop ()
{
if (elems.empty()) {
throw out_of_range("Stack<>::pop(): empty stack");
}
// 删除最后一个元素
elems.pop_back();
} template <class T>
T Stack<T>::top () const
{
if (elems.empty()) {
throw out_of_range("Stack<>::top(): empty stack");
}
// 返回最后一个元素的副本
return elems.back();
}
/* 模板函数 */
template <typename T>
inline T const& Max (T const& a, T const& b)
{
return a < b ? b:a;
} int main()
{
int i = 39;
int j = 20;
cout << "Max(i, j): " << Max(i, j) << endl; double f1 = 13.5;
double f2 = 20.7;
cout << "Max(f1, f2): " << Max(f1, f2) << endl; string s1 = "Hello";
string s2 = "World";
cout << "Max(s1, s2): " << Max(s1, s2) << endl; try {
Stack<int> intStack; // int 类型的栈
Stack<string> stringStack; // string 类型的栈 // 操作 int 类型的栈
intStack.push(7);
cout << intStack.top() <<endl; // 操作 string 类型的栈
stringStack.push("hello");
cout << stringStack.top() << std::endl;
stringStack.pop();
stringStack.pop();
}
catch (exception const& ex) {
cerr << "Exception: " << ex.what() <<endl;
return -1;
}
}
4. 其他容器stack, map
#include <iostream>
#include <stack>
#include <string>
#include <utility>
#include <map>
using namespace std; int main()
{
stack <int> s;
s.push(1);
s.push(2);
s.push(3);
s.push(4);
s.push(11); cout << "top of the stack:" << s.top() << endl;
cout << "the number of elements:" << s.size() << endl;
cout << "process of pop:" << endl; while (s.empty() != true) // stack isn't empty
{ cout << "\t\t";
cout << s.top() << endl; //read the top of the stack
s.pop(); // pop, and delete the top
} // key value
map <int, string> StuInfo;
StuInfo.insert(pair <int, string> (1, "Tom"));
StuInfo.insert(pair <int, string> (5, "Jack"));
StuInfo[2] = "Lily";
StuInfo[7] = "Bruce";
map <int, string>::iterator it; // 指针 for (it=StuInfo.begin(); it!=StuInfo.end(); it++)
{
cout << (*it).first << " " << (*it).second << endl;
} return 0;
}
了解C++常用容器,方便刷题。
C++ 模板和泛型编程(掌握Vector等容器的使用)的更多相关文章
- 标准模板库使用参考——vector向量容器
C++的STL从广义上讲分为algorithm(算法),container(容器)和iterator(迭代器)三类,包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法. 在C++标准库中,ST ...
- C++ Primer 学习笔记_76_模板与泛型编程 --模板定义[续]
模板与泛型编程 --模板定义[续] 四.模板类型形參 类型形參由keywordclass或 typename后接说明符构成.在模板形參表中,这两个keyword具有同样的含义,都指出后面所接的名字表示 ...
- C++ Primer 学习笔记_75_模板与泛型编程 --模板定义
模板与泛型编程 --模板定义 引言: 所谓泛型程序就是以独立于不论什么特定类型的方式编写代码.使用泛型程序时,我们须要提供详细程序实例所操作的类型或值. 模板是泛型编程的基础.使用模板时能够无须了解模 ...
- C++ Primer 学习笔记_76_模板和泛型编程 --模板定义[继续]
模板和泛型编程 --模板定义[续] 四.模板类型形參 类型形參由keywordclass或 typename后接说明符构成.在模板形參表中,这两个keyword具有同样的含义,都指出后面所接的名字表示 ...
- c++模板 与 泛型编程基础
C++模板 泛型编程就是以独立于任何特定类型的方式编写代码,而模板是泛型编程的基础. (1)定义函数模板(function template) 函数模板是一个独立于类型的函数,可以产生函数的特定类型版 ...
- 【c++ Prime 学习笔记】第16章 模板与泛型编程
面向对象编程(OOP)和泛型编程(GP)都能处理在编写程序时类型未知的情况 OOP能处理运行时获取类型的情况 GP能处理编译期可获取类型的情况 标准库的容器.迭代器.算法都是泛型编程 编写泛型程序时独 ...
- C++ 模板与泛型编程
<C++ Primer 4th>读书笔记 所谓泛型编程就是以独立于任何特定类型的方式编写代码.泛型编程与面向对象编程一样,都依赖于某种形式的多态性. 面向对象编程中的多态性在运行时应用于存 ...
- Cocos2d-x中Vector<T>容器以及实例介绍
Vector<T> 是Cocos2d-x 3.x推出的列表容器,因此它所能容纳的是Ref及子类所创建的对象指针,其中的T是模板,表示能够放入到容器中的类型,在Cocos2d-x 3.x中T ...
- C++ Primer 学习笔记_84_模板与泛型编程 --模板特化
模板与泛型编程 --模板特化 引言: 我们并不总是能够写出对全部可能被实例化的类型都最合适的模板.某些情况下,通用模板定义对于某个类型可能是全然错误的,通用模板定义或许不能编译或者做错误的事情;另外一 ...
- C++ Primer 学习笔记_79_模板与泛型编程 --模板编译模型
模板与泛型编程 --模板编译模型 引言: 当编译器看到模板定义的时候,它不马上产生代码.仅仅有在用到模板时,假设调用了函数模板或定义了模板的对象的时候,编译器才产生特定类型的模板实例. 一般而言,当调 ...
随机推荐
- 【mq】从零开始实现 mq-01-生产者、消费者启动
MQ 是什么? MQ(Message Queue)消息队列,是基础数据结构中"先进先出"的一种数据结构. 指把要传输的数据(消息)放在队列中,用队列机制来实现消息传递--生产者产生 ...
- VS2008的安装
1.先下载好VS008 方法1: 百度 搜 Visual Studio Team System 2008 Team Suite(90 天试用版) 方法2:直接在地址栏填入 http://www. ...
- Oracle 错误表
ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出 ...
- [ubuntu18.04 python3.6] 清华源 CondaHTTPError: HTTP 000 CONNECTION
问题 嫌官网源安装jupyter notebook太慢,所以尝试修改为清华源,但每次在Solving environment的时候就报错如下: 解决方法,修改conda配置信息: vim ~/.con ...
- openstack之Designate组件,入门级安装(快速)
@ 目录 前言 架构 前提准备 创建 DNS 服务 API 端点 安装和配置组件 验证操作 前言 Designate 是一个开源 DNS 即服务实施,是用于运行云的 OpenStack 服务生态系统的 ...
- Red Hat牵头推进NVFS文件系统
开源Linux 长按二维码加关注~ 上一篇:Linux中几个正则表达式的用法 由 Red Hat 工程师牵头的团队,正在为 Linux/开源社区研究名为 NVFS 的文件系统.NVFS 的目标是成为像 ...
- 面试官给我挖坑:rm删除文件之后,空间就被释放了吗?
在Linux,你是不是曾经天真的以为,使用rm删除一个文件,占用的空间就释放了?事情可能不是常常如人意. 产生一个指定大小的随机内容文件 我们先看一下当前各个挂载目录的空间大小: $ df -h /d ...
- 启动mysql报错ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)
mysql之前还好好的,突然就启动不了了,我也很纳闷,原来是服务没有启动 netstat -ntlp 后,发现并没有启动 于是我试着启动mysql service mysqld start 查看了my ...
- Spring Boot 动态修改 log level
引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...
- 手把手教你 bash中给变量赋值时 ' 和 " 和 ` 和 $() 的使用
1.赋值指令 var='变量内容' var="变量内容" var=`command` var=$(command) var=变量内容 2.格式要求 =两边不能有空白字符 错误示例 ...