想一想,C++貌似和C没有很大的区别,甚至可以用C的任何代码,除了引用不要和指针混淆。
总结一下目前已知的C艹和C的我写代码时候遇到的区别:
- #include ??? 没错,就是引入库的时候变了,不过都是输入输出流,没必要在意太多,不用".h"了
- 输入输出格式
cout << "" << endl;cin >> "";
- string,一个非常实用的类库
- 可以使用引用,可以理解为一个变量多个名字,而不像我们使用的指针变量取到的变量地址,更加灵活,这个引用我目前找不到什么用处。
- 数据类型多了bool,好像C#也只多了一个bool,啊,貌似也集合了string。
- 动态内存管理不需要用malloc了,直接用new就可以,比较灵活,直接自己判断数据类型和空间大小。
我的STL学习
STL(Standard Template Library)标准模板库!!再也不用我在C里面手打一堆了!从表面上来说,STL就是一些“容器“和“算法”的集合。其实编程不就是数据结构加算法么?容器就是将一些数据结构封装了,可以直接进行调用。
列举STL的所有头文件:、、、、、、
(不学STL的C++就不是完整的C艹)
简单的stl入门:
1、Container
是一种数据结构,也是stl中几乎是最重要的,包含了list,vector,stack,queue等。可以使用由容器类输出的迭代器。(这里一环扣一环)
2、Iterator
迭代器,是一种特殊的指针,它提供了访问容器中对象的方法,至于在程序设计中,它扮演了容器和算法之间的胶合剂,可以安全地对容器内容进行操作,或是进行算法模板的使用。(调用容器进行算法的构建,容器只是一个数据结构,即对象)
3、Algorithm
算法,是一类常用的算法模板,就可以对容器进行操作,同时其开放性也让算法类本身可以针对数组或是自定义结构体等结构进行直接的操作。
4、Function object
仿函数,抽象来说是一种行为类似函数,我们可以理解为一种高级的,重载了()操作符的结构体与类。/有点不懂/
5、Iterator Adaptor
迭代适配器,是一种用来修饰容器或者仿函数的接口,它使得适配器能够让算法以逆向模式、安插模式工作,甚至可以与流配合。对容器起到非常大的辅助作用,同时他还将迭代器进行了更高级别的抽象。
6、allocator
是负责空间的配置与管理,重点就是对容器的空间申请和空间释放进行管理,可以理解为C的malloc和free函数,C++的new和delete关键字。动态内存管理。
容器
- Vector
1、概念
可以翻译为向量,或向量数组,至于为什么以向量命名,可以理解为一维空间也是存在向量的。
Vector是最简单的容器,就像数组一样,向量使用连续的存储位置作为元素,这就意味着它们的元素可以使用常量指向其元素的偏移来访问,与数组一样有效。但与数组不同,他们的大小可以动态变化
,其存储由容器自动处理。(是动态的!!!!)
2、相关头文件->#include<vector>
3、初始化->vector<data_type>name;
vector<int> v1; //创建一个空的向量v1
vector<int> v2(10); //创建一个向量v2,其已开辟10个元素的空间,相当于int v[10];
vector<int> v3(10,5); //创建一个向量v3,其已开辟10个元素的空间并全部赋值为5
vector<int> v4(v3.begin(),v3.end()); //创建一个向量v4,其内容为向量v3的内容
vector<int> v5(v4); //创建一个向量v5,其包含了v4的全部内容
4、迭代器
是安全访问器,不像指针,可能造成内存访问错误,里面有很多预防错误的方法和多种访问方式。在stl使用中一般用迭代器对容器进行访问,因此创建容器的迭代器。
遍历代码:
vector<int> v; //创建一个向量v
vector<int>::iterator it; //C98标准
for(it=v.begin();it!=v.end();it++){
cout<<*it<<' ';
}//这不就是指针的形式么,还挺贴心的,为我们这些C老用户着想
下标形式:
for(int i=0;i<v.size();i++){
cout<<v[i]<<' ';
}
5、常用接口(此处没有全部列出)
首先,我们使用vector<int> v;
预先创建了一个向量
- 向量尾部插入push_back()
在向量的末尾加入一个新元素,并将容器自动扩容一个。
函数原型为:void push_back(const value_type& val);
使用举例:v.push_back(10); //插入一个数据10
- 向量尾部删除pop_back()
溢出向量尾的最后一个元素,并将容器大小减小一个。和上面的是相反的,推拉动作。
使用举例Lv.pop_back();
- 插入insert()
插入元素到指定位置,通过元素之前在指定位置插入新元素来扩展向量,从而有效地增加容器大小。
函数原型:
插入单一数据到指定位置:
iterator insert (iterator position, const value_type& val);
插入一段数据到指定位置:
void insert (iterator position, size_type n, const value_type& val);
插入一段别的容器的数据到指定位置:
template <class InputIterator>
void insert (iterator position, InputIterator first, InputIterator last);
举例:
v.insert(v.begin(),10); //在向量最前端插入数据10
v.insert(v.begin(),5,20); //在向量最前端插入5个数据20
vector<int> k(2,50); //创建一个新的向量k,其拥有2个元素内容均为50
v.insert(v.begin(),k.begin(),k.end()); //在向量v最前端插入向量K的全部内容
- 删除erase()
删除一个元素,或是一段区间的元素,将会自动缩减空间的使用。
函数原型:
iterator erase (iterator position);
iterator erase (iterator first, iterator last);
使用举例:
v.erase(v.begin());//删除第一个元素
v.erase(v.begin(),v.begin()+4);//删除从第一个开始后的四个元素,包括第一个
- 清空clear()
将向量中所有元素清空。
函数原型:
void clear();
使用举例:
v.clear();
//显然这的v都利用vector的类方法,很实用啊
- 数据大小size()
返回向量中的数据元素个数 。
函数原型:
size_type size() const;
使用举例:
cout << v.size() << endl;//输出数据大小
- 已开辟最大快读capacity()
返回向量最大已开辟的空间大小,明显和上面的有区别,因为开辟的空间可能没存数据。
函数原型:
size_type capacity() const;
使用举例:
vector<int>v(3,10)//创建默认有3个值为10的元素的向量v
v.insert(v.begin(),10,20);//在向量最前端插入10个值为20 的数据
v.erase(v.begin(),v,begin()+4);//删除从第一个开始后的四个元素
cout << v.size() << endl;//输出数据大小
cout << v.capacity() << endl;//输出容器大小
- *最大支持空间max_size()
返回计算机支持开辟vector的最大空间值,一般来说和计算机内存和CPU相关,是一个极大的数据,不同计算机中可能不同。
函数原型:
size_type max_size() const;
使用举例:
vector<int> v(5,10);//创建默认有五个值为10的元素的向量v
cout << v.max_size() <<endl; //输出可以创建的vector空间的最大值。