STL(三):vector and deque
讲这个东西之前,先来说一下,STL的大小,这里我们讲到的大小可能不是真正意义上的大小,而是自定义的大小
在缺省的情况下,以下三个说法等价:
- x比y小
- 表达式“x<y”为真
- y比x大
有时,“x和y相等”等价于“x==y为真”
例:在未排序的区间上进行的算法,如顺序查找find
有时“x和y相等”等价于“x小于y和y小于x同时为假”
例:有序区间算法,如binary_search,关联容器自身的成员函数find
#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
class A {
int v;
public:
A(int n):v(n) { }
bool operator < ( const A & a2) const {
//必须为常量成员函数
cout << v << "<" << a2.v << "?" << endl;
return false;
}
bool operator ==(const A & a2) const {
cout << v << "==" << a2.v << "?" << endl;
return v == a2.v;
}
};
int main()
{
A a [] = { A(1),A(2),A(3),A(4),A(5) };
cout << binary_search(a,a+4,A(9))<<endl; //折半查找
return 0;
}
1???返回true???,太毁三观了!!!
我们来分析一下
每次都用的是<运算符,所以它在比较过程中都是使用<的,而且我们在成员函数里面重载了<运算符,返回false.
vector
vector代码演示
#include <iostream>
#include <vector>
using namespace std;
template<class T>
void PrintVector( T s, T e)//函数模板打印数组元素
{
for(; s != e; ++s)
cout << * s << " ";
cout << endl;
}
int main() {
int a[5] = { 1,2,3,4,5 };
vector<int> v(a,a+5); //将数组a的内容放入v
cout << "1) " << v.end() - v.begin() << endl;
//两个随机迭代器可以相减,输出 1) 5
cout << "2) "; PrintVector(v.begin(),v.end());
//2) 1 2 3 4 5
v.insert(v.begin() + 2, 13); //在begin()+2位置插入 13
cout << "3) "; PrintVector(v.begin(),v.end());
//3) 1 2 13 3 4 5
v.erase(v.begin() + 2); //删除位于 begin() + 2的元素
cout << "4) "; PrintVector(v.begin(),v.end());
//4) 1 2 3 4 5
vector<int> v2(4,100); //v2 有4个元素,都是100
v2.insert(v2.begin(),v.begin()+ 1,v.begin()+3);
//将v的一段插入v2开头
cout << "5) v2: "; PrintVector(v2.begin(),v2.end());
//5) v2: 2 3 100 100 100 100
v.erase(v.begin() + 1, v.begin() + 3);
//删除 v 上的一个区间,即 2,3
cout << "6) "; PrintVector(v.begin(),v.end());
//6) 1 4 5
return 0;
}
下面来讲一下使用vector实现二维数组
原理就是一个一维数组里面每个元素都是一个一维数组
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<vector<int>> v(3);//v里面三个元素都是数组
for(int i=0;i<v.size();++i)
{
for(int j=0;j<4;++j)
{
v[i].push_back(j);
}
}
for(int i=0;i<v.size();++i){
for(int j=0;j<v[i].size();++j)
cout<<v[i][j]<<" ";
cout<<endl;
}
return 0;
}
下面提供一个使用速查函数表
想了解更多vector的问题可以看vector
deque(双向队列)
所有适用于 vector的操作都适用于 deque
另外还有push_front(将元素插入到前面) 和pop_front(删除最前面的元素)操作
上述两个操作复杂度都是O(1)
学会程序和算法,走遍天下都不怕
冰岛众神瀑布