文章目录
- sort
- map
- vector
- stack
- queue
- priority_queue
初学C++,发现经常在文件中有using namespace std这个东西。
首先 namespace 这个东西叫做命名空间。using有好几种用法,这里使用的是using的命名空间的使用。
std是C++中的一个命名空间,叫做标准命名空间。C++标准库中的函数或者对象都是在命名空间std中定义的,
所以我们要使用标准函数库中的函数或对象都要使用std来限定。通俗的讲就是说 我们平常用的标准库中的cout,cin其实都是
sort
语法
sort(start,end,cmp)
(1) start表示要排序数组的起始地址;
(2) end表示数组结束地址的下一位;
(3) cmp用于规定排序的方法,可不填,默认升序。
[start,end)
less< int >()为升序,greater< int >()为降序
平均时间复杂度为O(nlogn)
#include <stdio.h>
#include <algorithm>
#include <functional>
using namespace std;
const int maxn=10;
int arr[maxn+5]={1,2,3,4,5,6,7,8,9,10};
int main(){sort(arr,arr+10,greater<int>());for(int i=0;i<10;i++) printf("%d ",arr[i]);return 0;
}
map
map是STL的一个关联容器,它提供一对一的hash。
第一个可以称为关键字(key),每个关键字只能在map中出现一次;
第二个可能称为该关键字的值(value);
2,map的功能
自动建立key - value的对应。key 和 value可以是任意你需要的类型,包括自定义类型。
// 定义一个map对象
map<int, string> mapStudent;// 第一种 用insert函數插入pair
mapStudent.insert(pair<int, string>(000, "student_zero"));// 第二种 用"array"方式插入
mapStudent[123] = "student_first";
mapStudent[456] = "student_second";
//迭代器刪除
map<int, string>::iterator iter;
iter = mapStudent.find("123");
mapStudent.erase(iter);//用关键字刪除
int n = mapStudent.erase("123"); //如果刪除了會返回1,否則返回0//用迭代器范围刪除 : 把整个map清空
mapStudent.erase(mapStudent.begin(), mapStudent.end());
//等同于mapStudent.clear()
map的遍历
#include<iostream>
#include<map>
using namespace std;
int main(){map <int ,string> mp;mp.insert(pair<int,string>(1,"a"));mp.insert(pair<int,string>(2,"b"));mp[2]="c";mp[4]="d";//创建对应类型的迭代器map<int, string>::iterator iter; //调用map中的begin()和end()函数,使得迭代器指针能够遍历整个map容器for(iter = mp.begin(); iter != mp.end(); iter++) //其中iter->frist为map中的key,iter->second为map中的valuecout<<iter->first<<' '<<iter->second<<endl; return 0;
}
map中数据的查找
用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。
#include<iostream>
#include<map>
using namespace std;
int main(){map <int ,string> mp;mp.insert(pair<int,string>(1,"a"));mp.insert(pair<int,string>(2,"b"));mp[3]="c";mp[4]="d";map<int, string>::iterator iter; for(iter = mp.begin(); iter != mp.end(); iter++) cout<<iter->first<<' '<<iter->second<<endl; //查找//注意find函数中传的是要查找的元素的keyiter = mp.find(2);if(iter!=mp.end()){cout<<iter->second<<endl;}else{cout<<"not find"<<endl;}return 0;
}
基本操作函数
9,map的基本操作函数:C++ maps是一种关联式容器,包含“关键字/值”对begin() 返回指向map头部的迭代器clear() 删除所有元素count() 该数据是否存在,存在返回1,不存在返回0empty() 如果map为空则返回trueend() 返回指向map末尾的迭代器equal_range() 返回特殊条目的迭代器对erase() 删除一个元素find() 查找一个元素get_allocator() 返回map的配置器insert() 插入元素key_comp() 返回比较元素key的函数lower_bound() 返回键值>=给定元素的第一个位置max_size() 返回可以容纳的最大元素个数rbegin() 返回一个指向map尾部的逆向迭代器rend() 返回一个指向map头部的逆向迭代器size() 返回map中元素的个数swap() 交换两个mapupper_bound() 返回键值>给定元素的第一个位置value_comp() 返回比较元素value的函数
vector
在c++中,vector是一个十分有用的容器。
作用:它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
vector在C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。
使用方法:
vector<int>test;//建立一个vectortest.push_back(1);test.push_back(2);//把1和2压入vector,这样test[0]就是1,test[1]就是2
vector<vector<Point2f> > points; //定义一个二维数组points[0].size(); //指第一行的列数
1 、基本操作
(1)头文件#include.
(2)创建vector对象,vector vec;
(3)尾部插入数字:vec.push_back(a);
(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。
(5)使用迭代器访问元素.
vector::iterator it;
for(it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;
(6)插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;
(7)删除元素: vec.erase(vec.begin()+2);删除第3个元素
vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始
(8)向量大小:vec.size();
(9)清空:vec.clear();
四、几种重要的算法,使用时需要包含头文件:
#include
(1)sort(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素进行从小到大排列
(2)reverse(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素倒置,但不排列,如a中元素为1,3,2,4,倒置后为4,2,3,1
(3)copy(a.begin(),a.end(),b.begin()+1); //把a中的从a.begin()(包括它)到a.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开 始复制,覆盖掉原有元素
(4)find(a.begin(),a.end(),10); //在a中的从a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置
二维vector
vector < vector > a; // a是向量类型的向量
for (j = 0; j < row; j++){for (i = 0; i <column; i++){a[j].push_back(i+j);}}
for (i = 0; i < a.size(); i++){for (j = 0; j < a[i].size(); j++){cout << a[i][j] << " "; }cout << endl; // 输出一行就换行 }
stack
先进后出(FILO)的数据结构。
c++ stl栈stack的头文件为:
#include
c++ stl栈stack的成员函数介绍
操作 比较和分配堆栈
empty() 堆栈为空则返回真
pop() 移除栈顶元素
push() 在栈顶增加元素
size() 返回栈中元素数目
top() 返回栈顶元素
queue
一.queue模版类的定义在头文件中。
queue与stack模版非常类似,queue模版也需要定义两个模版参数,一个是元素类型,一个是容器类型,元素类型是必要的,容器类型是可选的,默认为dqueue类型。
定义queue对象的示例代码如下:
queueq1;
queueq2;
queue的基本操作有:
1.入队:如q.push(x):将x元素接到队列的末端;
2.出队:如q.pop() 弹出队列的第一个元素,并不会返回元素的值;
3,访问队首元素:如q.front()
4,访问队尾元素,如q.back();
5,访问队中的元素个数,如q.size();
priority_queue
用法:#include
定义:priority_queue q;(队头最大)
priority_queue<int,vector,greater > q; (队头最小)
也可以对struct使用,重载struct的<即可。
功能:
函数 功能
q.top() 队头
q.pop() 弹出队头
q.push() 加入队列
q.empty() 是否为空
priority_queue<int ,vector,cmp>pq
struct cmp{bool operator()(const int a,const int b)const{retrun a>b;//这里是实现一个“个位数大的整数优先级小”的优先队列}
};