STL初识
C++的面向对象和泛型编程思想,目的就是提高代码复用性。STL(Standard Template Library)标准模板库,从广义上分为:容器(container)、算法(algorithm)、迭代器(iterater),容器即为数据结构,本篇着重介绍C++中定义好的常用的容器,包括vector、string、list、deque、set、map。学会这些容器的使用,再学数据结构与算法,利用已有的容器去实现自定义的数据结构将事半功倍,看算法也将如鱼得水。
vector
vector的定义
首先,你要用C++中定义好的数据结构容器需要包含其头文件,此处要用到vector容器,先包含其头文件:
#include <vector>
创建vector容器结构体(类)对象:
vector<储存的数据类型> 容器结构体(类)对象名称
例如:
vector<int> v;
储存的数据类型可以为自定义数据类型,也可以定义vector数组
vector常用的成员函数
size()//返回容器中元素个数
begin()//返回头部迭代器
end()//返回尾部+迭代器
rbegin()//返回逆首部迭代器
rend()//返回逆尾部-迭代器
front()//返回首元素值
back()//返回尾部元素值
push_back()//在末尾插入一个元素
pop_back()//弹出最后一个元素
swap()//交换连个容器
insert()//在指定位置插入元素
erase()//在指定位置删除元素
empty()//判断容器是否为空
clear()//清空容器
常用成员函数参数讲解
push_back(x);
x为插入元素的值
swap(v2);
实现调用容器和v2容器中元素的互换
insert(position,x);
insert(position,n,x);
insert(position,first,last);
第一个为在迭代器position位置前插入值为x的元素,第二个为在迭代器position位置前插入n个值为x的元素,第三个为在迭代器position位置前插入另一个容器first到last的一段(复杂度高,不建议使用,因此不详细解释,想了解可以查一下)
erase(position);
erase(first,last);
第一个为删除迭代器position位置的元素,第二个为删除一段序列(同样复杂度高,不建议使用)
示例代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void print(int val)
{
cout << val <<" ";
}
void test() {
vector<int> v1;
vector<int> v2;
v2.push_back(15);
v2.push_back(1);
v2.push_back(5);
for (int i = 0; i < 10; i++) {
v1.push_back(i);
}
cout << v1.front() << " " << v1.back() << endl;
cout << v1.size() << endl;
v1.pop_back();
vector<int>::iterator it = v1.begin();
for (; it != v1.end(); it++) {
cout << *it << " ";
}
cout << endl;
v1.insert(it, 2);
for (int i = 0; i < v1.size(); i++) {
cout << v1[i] << " ";
}
cout << endl;
v1.erase(v1.begin());
for (int i = 0; i < v1.size(); i++) {
cout << v1.at(i) << " ";
}
cout << endl;
v1.swap(v2);
for_each(v1.begin(), v1.end(), print);
cout << endl;
v1.clear();
cout << v1.empty() << endl;
}
int main() {
test();
system("pause");
return 0;
}
vector容器的遍历
迭代器遍历
for(vector<int>::iterator it = v.begin();it != v.end();it++){
cout<<*it<<" ";
}
[]遍历
for(int i = 0;i < v.size();i++){
cout<<v[i]<<" ";
}
利用成员函数at遍历
```c++
for(int i = 0;i < v.size();i++){
cout<<v。at(i)<<" ";
}
利用内置函数for_each,需要包含头文件algorithm
```c++
#include <algorithm>
void print(int val){
cout<<val<<" ";
}
for_each(v.begin(),v.end(),print);
for_each利用的回调,这里不细讲,本人也尚未学懂,有兴趣可以查查;
遍历方法还有,掌握以上几种基本够用,初步只掌握迭代器遍历和[]遍历即可。