一、vector使用
1、常用操作
(1)a.assign(b.begin(), b.begin()+3); //b为向量,将b的0~2个元素构成的向量赋给a // 复制
(2)a.assign(4,2); //是a只含4个元素,且每个元素为2
(3)a.back(); //返回a的最后一个元素
(4)a.front(); //返回a的第一个元素
(5)a[i]; //返回a的第i个元素,当且仅当a[i]存在2013-12-07
(6)a.clear(); //清空a中的元素
(7)a.empty(); //判断a是否为空,空则返回ture,不空则返回false
(8)a.pop_back(); //删除a向量的最后一个元素
(9)a.erase(a.begin()+1,a.begin()+3); //删除a中第1个(从第0个算起)到第2个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+3(不包括它);
a.erase(it); erase函数可以用于删除vector容器中的一个或者一段元素,在删除一个元素的时候,其参数为指向相应元素的迭代器
(10)a.push_back(5); //在a的最后一个向量后插入一个元素,其值为5
(11)a.insert(a.begin()+1,5); //在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,4
(12)a.insert(a.begin()+1,3,5); //在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5
(13)a.insert(a.begin()+1,b+3,b+6); //b为数组,在a的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8 ,插入元素后为1,4,5,9,2,3,4,5,9,8
(14)a.size(); //返回a中元素的个数;
(15)a.capacity(); //返回a在内存中总共可以容纳的元素个数
(16)a.resize(10); //将a的现有元素个数调至10个,多则删,少则补,其值随机
(17)a.resize(10,2); //将a的现有元素个数调至10个,多则删,少则补,其值为2
(18)a.reserve(100); //将a的容量(capacity)扩充至100,也就是说现在测试a.capacity();的时候返回值是100.这种操作只有在需要给a添加大量数据的时候才 显得有意义,因为这将避免内存多次容量扩充操作(当a的容量不足时电脑会自动扩容,当然这必然降低性能)
(19)a.swap(b); //b为向量,将a中的元素和b中的元素进行整体性交换
(20)a==b; //b为向量,向量的比较操作还有!=,>=,<=,>,<;
(21)sort(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素进行从小到大排列
(22)reverse(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素倒置,但不排列,如a中元素为1,3,2,4,倒置后为4,2,3,1
(23)copy(a.begin(),a.end(),b.begin()+1); //把a中的从a.begin()(包括它)到a.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开 始复制,覆盖掉原有元素
(24)find(a.begin(),a.end(),10); //在a中的从a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置
- 补充
c++中vector find使用
不同于map(map有find方法),vector本身是没有find这一方法,其find是依靠algorithm来实现的。
2、遍历vector
(1)迭代器遍历
#include <iostream> #include <vector> using namespace std; // vector容器遍历方式1 —— 迭代器遍历 void traverseVector_2(vector<int> v) { // 注:如果参数为const vector<int> 需要用const_iterator vector<int>::iterator it = v.begin(); // vector<int>::const_iterator iter=v.begin(); for(; it != v.end(); ++it) { cout<<(*it)<<" "; } cout<<endl; }
(2)下标遍历
// vector容器遍历方式2 —— 下标遍历 void traverseVector_1(vector<int> v) { for(unsigned int i = 0; i < v.size(); ++i) { cout<<v[i]<<" "; } cout<<endl; }
二、map常用操作
1、常用操作
begin() 返回指向map头部的迭代器
clear() 删除所有元素 count() 返回指定元素出现的次数 empty() 如果map为空则返回true end() 返回指向map末尾的迭代器 erase() 删除一个元素 find() 查找一个元素 insert() 插入元素 key_comp() 返回比较元素key的函数 lower_bound() 返回键值>=给定元素的第一个位置 max_size() 返回可以容纳的最大元素个数 rbegin() 返回一个指向map尾部的逆向迭代器 rend() 返回一个指向map头部的逆向迭代器 size() 返回map中元素的个数
2、1 插入
// 定义一个map对象 map<int, string> mapStudent; // 第一种 用insert函數插入pair mapStudent.insert(pair<int, string>(000, "student_zero")); // 第二种 用insert函数插入value_type数据 mapStudent.insert(map<int, string>::value_type(001, "student_one")); // 第三种 用"array"方式插入 mapStudent[123] = "student_first"; mapStudent[456] = "student_second";
2.2、 取值
Map中元素取值主要有at和[ ]两种操作,at会作下标检查,而[]不会。
map<int, string> ID_Name; //ID_Name中没有关键字2016,使用[]取值会导致插入 //因此,下面语句不会报错,但打印结果为空 cout<<ID_Name[2016].c_str()<<endl; //使用at会进行关键字检查,因此下面语句会报错 ID_Name.at(2016) = "Bob";
2.3、查找
当所查找的关键key出现时,它返回数据所在对象的位置,如果沒有,返回iter与end函数的值相同。
// find 返回迭代器指向当前查找元素的位置否则返回map::end()位置 iter = mapStudent.find("123"); if(iter != mapStudent.end()) cout<<"Find, the value is"<<iter->second<<endl; else cout<<"Do not Find"<<endl;
2.4、刪除与清空元素
//迭代器刪除 iter = mapStudent.find("123"); mapStudent.erase(iter); //用关键字刪除 int n = mapStudent.erase("123"); //如果刪除了會返回1,否則返回0 //用迭代器范围刪除 : 把整个map清空 mapStudent.erase(mapStudent.begin(), mapStudent.end()); //等同于mapStudent.clear()
2.5、map容器的迭代器first、second用法
c++ 里面的map容器的迭代器first、second用法
例:
map<string, int> m_stlmap;
m_stlmap[“xiaomi”] = 88;
auto mpit = m_stlmap.begin();
first会得到Map中key的有效值,
second会得到Map中value的有效值。
所以
mpit ->first; // 得到是 string 值是 “xiaomi”
mpit ->second; //得到是 int 值是 88
- 注意
pair<int, int>中
用.frist 和 .second
2.6、遍历
map<string,int> m; map<string,int>::iterator it; it = m.begin(); while(it != m.end()) { it->first; it->second; it ++; }
3、vector和map混合使用
- it->second[i];
int main() { map<int, int> store; map<int, vector<int>> data; store.insert(pair<int, int>(1, 100)); store.insert(pair<int, int>(2, 200)); store.insert(pair<int, int>(3, 300)); data.insert(pair<int, vector<int>>(1, { 10, 100, 1000 })); data.insert(pair<int, vector<int>>(2, { 20, 200, 2000 })); map<int, int>::iterator it = store.begin(); /* for (int i = 0; i < data[1].size(); i++) { cout << data[1][i] << endl; } */ if (data.find(1) != data.end()) { map<int, vector<int>>::iterator it = data.find(1); for (int i = 0; i < it->second.size(); i++) { cout << it->second[i] << endl; } }
三、其他一些函数
1、rand()函数
C++中rand() 函数的用法
1、rand()不需要参数,它会返回一个从0到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数。
2、如果你要产生0-99这100个整数中的一个随机整数,可以表达为:int num = rand() % 100;
这样,num的值就是一个0-99中的一个随机数了。
3、如果要产生1-100,则是这样:int num = rand() % 100 + 1;
4、总结来说,可以表示为:int num = rand() % n +a;
其中的a是起始值,n-1+a是终止值,n是整数的范围。
5、一般性:rand() % (b-a+1)+ a ; 就表示 a~b 之间的一个随机整数。格式
rand(产生随机数)
表头文件: #include<stdlib.h>
定义函数 :int rand(void)
四、一些其他数据结构
1、priority_queue(优先队列)
对于这个模板类priority_queue,它是STL所提供的一个非常有效的容器。
作为队列的一个延伸,优先队列包含在头文件 <queue> 中。</queue>成员函数
假设type类型为int,则:- bool empty() const
返回值为true,说明队列为空; - int size() const
返回优先队列中元素的数量; - void pop()
删除队列顶部的元素,也即根节点 - int top()
返回队列中的顶部元素,但不删除该元素; - void push(int arg)
将元素arg插入到队列之中;
- bool empty() const
五、queue
1、常用操作
- queue 操作
queue 和 stack 有一些成员函数相似,但在一些情况下,工作方式有些不同: - front():返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
- back():返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
- push(const T& obj):在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 - push_back() 来完成的。
- push(T&& obj):以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数 push_back() 来完成的。
- pop():删除 queue 中的第一个元素。
- size():返回 queue 中元素的个数。
- empty():如果 queue 中没有元素的话,返回 true。
- emplace():用传给 emplace() 的参数调用 T 的构造函数,在 queue 的尾部生成对象。
- swap(queue<t> &other_q):将当前 queue 中的元素和参数 queue 中的元素交换。它们需要包含相同类型的元素。也可以调用全局函数模板 swap() 来完成同样的操作。</t>