C++ STL常用算法详解
find的用法:
原文链接:http://c.biancheng.net/view/570.html
find() 为在输入迭代器所定义的范围内查找单个对象的算法,它可以在前两个参数指定的范围内查找和第三个参数相等的第一个对象。
find 算法会返回一个指向被找到对象的迭代器,如果没有找到对象,会返回这个序列的结束迭代器。下面展示了如何使用 find():
std::vector<int> numbers {5, 46, -5, -6, 23, 17, 5, 9, 6, 5}; int value {23}; auto iter = std::find(std::begin(numbers), std::end(numbers), value); if (iter != std:: end (numbers)) std::cout << value << " was found. \n";
这段代码会输出一条在 numbers 中找到 23 的消息,当然,可以反复调用 find() 来找出这个序列中所有给定元素的匹配项:
size_t count {}; int five {5}; auto start_iter = std::begin(numbers); auto end_iter = std::end(numbers); while((start_iter = std::find(start_iter, end_iter, five)) != end_iter) { ++count; ++start_iter; } std::cout << five << " was found " << count << " times." << std::endl; // 3 times
在 while 循环中,count 变量会通过自增来记录 five 在 vector 容器 numbers 中的发现次数。循环表达式调用 find(),在 start_iter 和 end_iter 定义的范围内查找 five。find() 返回的迭代器被保存在 start_ter 中,它会覆盖这个变量先前的值。最初,find() 会搜索 numbers 中的所有元素,因此 find() 会返回一个指向 five 的第一个匹配项的迭代器。
每次找到 five,循环体中的startjter都会自增,因此它会指向被找到元素的后一个元素。所以,下一次遍历搜索的范围是从这个位置到序列末尾。当不再能够找到 five 时,find() 会返回 end_iter,循环结束。
vector的简单用法:
原文地址:https://blog.csdn.net/wkq0825/article/details/82255984
vector 是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器。vector 是C++ STL的一个重要成员,使用它时需要包含头文件:
#include<vector>;
一、vector 的初始化:可以有五种方式,举例说明如下:
vector<int> a(10); //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的。 vector<int> a(10,1); //定义了10个整型元素的向量,且给出每个元素的初值为1 vector<int> a(b); //用b向量来创建a向量,整体复制性赋值 vector<int> a(b.begin(),b.begin+3); //定义了a值为b中第0个到第2个(共3个)元素 int b[7]={1,2,3,4,5,9,8}; vector<int> a(b,b+7); //从数组中获得初值
二、vector对象的几个重要操作,举例说明如下:
a.assign(b.begin(), b.begin()+3); //b为向量,将b的0~2个元素构成的向量赋给a a.assign(4,2); //是a只含4个元素,且每个元素为2 a.back(); //返回a的最后一个元素 a.front(); //返回a的第一个元素 a[i]; //返回a的第i个元素,当且仅当a[i]存在2013-12-07 a.clear(); //清空a中的元素 a.empty(); //判断a是否为空,空则返回ture,不空则返回false a.pop_back(); //删除a向量的最后一个元素 a.erase(a.begin()+1,a.begin()+3); //删除a中第1个(从第0个算起)到第2个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+ 3(不包括它) a.push_back(5); //在a的最后一个向量后插入一个元素,其值为5 a.insert(a.begin()+1,5); //在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,4 a.insert(a.begin()+1,3,5); //在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5 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 a.size(); //返回a中元素的个数; a.capacity(); //返回a在内存中总共可以容纳的元素个数 a.resize(10); //将a的现有元素个数调至10个,多则删,少则补,其值随机 a.resize(10,2); //将a的现有元素个数调至10个,多则删,少则补,其值为2 a.reserve(100); //将a的容量(capacity)扩充至100,也就是说现在测试a.capacity();的时候返回值是100.这种操作只有在需要给a添加大量数据的时候才 显得有意义,因为这将避免内存多次容量扩充操作(当a的容量不足时电脑会自动扩容,当然这必然降低性能) a.swap(b); //b为向量,将a中的元素和b中的元素进行整体性交换 a==b; //b为向量,向量的比较操作还有!=,>=,<=,>,<
三、顺序访问vector的几种方式,举例说明如下:
(1)向向量a中添加元素
1、
vector<int> a; for(int i=0;i<10;i++) a.push_back(i);
2、也可以从数组中选择元素向向量中添加
int a[6]={1,2,3,4,5,6}; vector<int> b; for(int i=1;i<=4;i++) b.push_back(a[i]);
3、也可以从现有向量中选择元素向向量中添加
int a[6]={1,2,3,4,5,6}; vector<int> b; vector<int> c(a,a+4); for(vector<int>::iterator it=c.begin();it<c.end();it++) b.push_back(*it);
4、也可以从文件中读取元素向向量中添加
ifstream in("data.txt"); vector<int> a; for(int i; in>>i) a.push_back(i);
5、【误区】
vector<int> a; for(int i=0;i<10;i++) a[i]=i; //这种做法以及类似的做法都是错误的。刚开始我也犯过这种错误,后来发现,下标只能用于获取已存在的元素,而现在的a[i]还是空的对象
(2)从向量中读取元素
1、通过下标方式读取
int a[6]={1,2,3,4,5,6}; vector<int> b(a,a+4); for(int i=0;i<=b.size()-1;i++) cout<<b[i]<<" ";
2、通过遍历器方式读取
int a[6]={1,2,3,4,5,6}; vector<int> b(a,a+4); for(vector<int>::iterator it=b.begin();it!=b.end();it++) cout<<*it<<" ";
vector<vector<int> >的用法
原文地址:https://www.cnblogs.com/tyty-Somnuspoppy/p/9361821.html
vector<vector<int>> A;//错误的定义方式 vector<vector<int> > A;//正确的定义方式
2、插入元素
若想定义A = [[0,1,2],[3,4]],有两种方法。
(1)定义vector B分别为[0,1,2]和[3,4],然后放入vector A。
vector<vector<int> > A; vector<int> B; B.push_back(0); B.push_back(1); B.push_back(2); A.push_back(B); B.clear(); B.push_back(3); B.push_back(4); A.push_back(B);
(2)
vector<vector<int> > A; for(int i = 0; i < 2; ++i) A.push_back(vector<int>()); A[0].push_back(0); A[0].push_back(1); A[0].push_back(2); A[1].push_back(3); A[1].push_back(4);
3、长度
//vector<vector<int> >A中的vector元素的个数 len = A.size(); //vector<vector<int> >A中第i个vector元素的长度 len = A[i].size();
4、访问某元素
访问某元素时,方法和二维数组相同,例如:
//根据前面的插入,可知输出1。 printf("%d\n", A[0][1]);