STL标准模板库提供三种类型的组件:容器,迭代器和算法,他们都支持泛型程序设计标准;

容器主要分为两大类:顺序容器和关联容器。顺序容器有:(vector, list, deque和string等)是一系列元素的有序集合。关联容器:(set, multiset,map, multimap)包含查找元素的键值;

迭代器的作用是遍历容器;

在进行多组测试数据是一定要注意:在每组测试之后都要清空,否则容器会保留上一次测试的数据;(例最下)

Vector 使用 I:

#include <iostream>

#include <vector>  //向量需要;

#include <cstdio>

#include <numeric>  //accumulate算法需要;

using namespace std;

int a[10005];

int main()

{

vector <int> v;   //定义向量v;

vector<int>::iterator it;  //定义迭代器it;

int n;

while(~scanf("%d", &n))

{

for(int i=0; i<n; i++) {  //赋值;

scanf("%d", &a[i]);

v.push_back(a[i]);

}

for(it=v.begin(); it!=v.end(); it++) {//使用iterator迭代器顺序遍历所有元素;

printf("%d ", *it);  //输出迭代器当前位置上的元素值;

}

printf("\n");

printf("%d\n",accumulate(v.begin(), v.end(), 0));  //统计并输出向量所有元素的和;

}

return 0;

}

实现斐波那契数列:

#include <iostream>

#include <vector>

using namespace std;

int main()

{

vector <unsigned int> v;

unsigned int n;

v.push_back(0);

v.push_back(1);

for(int i=2; i<50; i++) {

v.push_back(v[i-1]+v[i-2]);

}

while(cin >> n) {

cout << v[n] << endl;

}

return 0;

}

//ZOJ 1179

#include <iostream>

#include <cstdio>

#include <numeric>

#include <vector>

using namespace std;

int main()

{

vector <double> v;

int n;

while(~scanf("%d", &n)) {

double m;

v.clear();

for(int i=0; i<n; i++) {

scanf("%lf", &m);

v.push_back(m);

}

double sum =(double)accumulate(v.begin(), v.end(), 0)/n;

printf("%.3lf\n", sum);

}

return 0;

}

***创建vector对象***  

vector 向量容器不但能像数组一样对元素进行随机访问,还能在尾部插入元素,是一种简单,高效的容器,完全可以代替数组;

值得注意的是, vector容器具有自动管理的功能,对于元素的插入和删除,可动态调整所占的内存空间;使用vector向量容器,需要包含头文件#include<vector>;

vector容器的下表是从0开始计数的,也就是说,如果vector容器的大小是n, 那么元素的下表是从0~ n-1;对于vector容器的容量定义,可以实现定义一个固定的大小,事后,可以随时调整大小,也可以事先不定义,随时使用push_back()方法从尾部扩张元素,也可以使用insert()在某个元素位置前插入新元素;

vector容器有两种重要的方法,begin() 和 end() 。begin()返回的是首元素位置的迭代器;end()返回的是最后一个元素的下一元素位置的迭代器;

***创建vector对象***

有三种形式:

(1). 不指定容器的元素个数,如定义一个用来存储整型的容器:

vector <int> v;

(2). 创建时,指定容器的大小,如定义一个用来存储10个double类型元素的向量容器:

vector <int> v(10);   //注意:元素的下标为0~9, 另外每个元素具有指定的初始值;

(3). 创建一个具有n个元素的向量容器对象,每个元素具有指定的初始值;

vector <double> v(10, 8.6);  //定义了一个具有10个元素的向量容器,每个元素的值是8.6;

***尾部元素扩张***

***使用push_back()在尾部追加元素***// 也就是尾部元素扩张

尾部追加元素,vector容器会自动分配新内存空间。对空的vector对象扩张,也可对已有元素的vector对象扩张;

例:将2,7,9三个元素从尾部添加到v容器中,这样,v容器中就有三个元素2,7,9;

#include<iostream>

#include<vector>

using namespace std;

int main(int argc,char *argv[])

{

vector<int>v;

v.push_back(2);

v.push_back(7);

v.push_back(9);

return 0;

}

***下标方式访问vector元素***

访问或遍历vector对象---对于vector对象,可以采用下标方式随意访问他的某个元素,当然,也可以以下标方式对某元素重新赋值,这点类似于数组的访问方式;

采用上一节的例子,用下标的方法访问容器内的元素:

#include<iostream>

#include<vector>

using namespace std;

int main(int argc,char *argv[])

{

vector<int>v(3);

v[0] = 2;

v[1] = 7;

v[2] = 9;

cout << v[0] << " "<< v[1] << " " << v[2] << endl;

return 0;

}

***迭代器方式访问vector元素***

常使用迭代器配合for循环语句来对vector对象进行遍历访问,迭代器的额类型一定要与他要遍历的vector对象的元素类型一致;

#include<iostream>

#include<vector>

using namespace std;

int main(int argc,char *argv[])

{

vector<int>v(3);

v[0] = 2;

v[1] = 7;

v[2] = 9;

//定义迭代器变量

vector <int> :: iterator it;

for(it=v.begin(); it != v.end(); it++) {

//输出迭代器上的元素值;

cout << *it << "";

}

cout << endl;  //换行;

return 0;

}

***vector元素插入***

insert()插入方法可以在vector对象的任意位置前插入一个新的元素,同时,vector自动扩张一个元素的空间,插入位置后的所有元素一次向后挪动一个位置;

要注意的是,insert()方法要求插入的位置,是元素的迭代器位置,而不是元素的下标;

运行结果:8 2 1 7 9 5 3

#include<iostream>

#include<vector>

using namespacestd;

int main(int argc,char *argv[])

{

vector <int> v(3);

vector <int> :: iterator it;  //定义迭代器变量;

v[0] = 2;

v[1]= 7;

v[2] = 9;

v.insert(v.begin(), 8);  //在最前面插入一个新元素,元素值为8;

v.insert(v.begin()+2, 1);  //在第二个元素前插入新元素1;

v.insert(v.end(), 3);  //在向量末尾追加新元素3;

v.insert(v.end()-1, 5);   //在向量倒数第二个元素后面插入一个新元素5;

for(it=v.begin(); it != v.end(); it++) {

//输出迭代器上的元素值;

cout << *it << "";

}

cout << endl;  //换行;

return 0;

}

***vector元素删除***

erase()方法可以删除vector中迭代器所致的一个元素或一段区间中的所有元素。

clear()则一次性删除vector中的所有元素;

#include<iostream>

#include<vector>

using namespace std;

int main(int argc,char *argv[])

{

vector <int> v(10);

vector <int> :: iterator it;

for(int i=0; i<10; i++) {

v[i] = i;

}

v.erase(v.begin()+2);   //删除第二个元素,从0开始计数;

for(it=v.begin(); it != v.end(); it++) {

cout << *it << "";

}

cout << endl;

v.erase(v.begin()+1, v.begin()+5);   //删除区间[1, 5)的元素;

for(it=v.begin(); it != v.end(); it++) {

cout << *it<< " ";

}

cout << endl;

v.clear(); //删除全部元素;(清空向量)

cout << v.size() << endl;  //输出姓梁大小;

return 0;

}

***vector元素反向排列***

reverse反向排列算法,需要定义头文件#include<algorithm>;

reverse算法可将向量中某段迭代器区间元素反向排列;

#include<iostream>

#include<vector>

#include<algorithm>

using namespacestd;

int main(int argc,char *argv[])

{

vector <int> v(10);

vector <int> :: iterator it;

for(int i=0;i<10; i++) {

v[i] = i;

}

for(it=v.begin(); it != v.end(); it++) {

cout << *it << "";

}

cout << endl;

reverse(v.begin(), v.end());  //反向排列向量的从头到尾间的元素;

for(it=v.begin(); it != v.end(); it++) {

cout << *it << "";

}

cout << endl;

return 0;

}

***使用sort算法对vector内元素排序***

使用sort算法必须添加头文件#include <algorithm>;

sort算法要求使用随机访问迭代器进行排序,在默认的情况下,对向量元素进行升序排列;

跟对数组排序的过程相似;

#include<iostream>

#include <vector>

#include<algorithm>

using namespace std;

int main(int argc,char *argv[])

{

vector <int> v;

vector <int> :: iterator it;

for(int i=0; i<10; i++) {

v.push_back(9-i);

}

for(int i=0; i<10; i++) {  //输出排序前的元素值;

cout << v[i] << "";

}

cout << endl;

sort(v.begin(), v.end());  //升序排列;

for(it=v.begin(); it != v.end(); it++){  //输出排序后的元素值;

cout << *it << "";

}

cout << endl;

return 0;

}

还可以自己定义cmp排序比较函数,然后,把这个函数指定给sort算法,那么,sort就根据这个比较函数指定的排序规则进行排序。下例是从大到小排序;

#include<iostream>

#include<vector>

#include<algorithm>

using namespacestd;

bool cmp(constint a, const int b)

{

return a > b;

}

int main(int argc,char *argv[])

{

vector <int> v;

vector <int> :: iterator it;

for(int i=0; i<10; i++) {

v.push_back(i);

}

for(int i=0; i<10; i++) {  //输出排序前的元素值;

cout << v[i] << "";

}

cout << endl;

sort(v.begin(), v.end(), cmp);  //升序排列;

for(it=v.begin(); it != v.end(); it++){  //输出排序后的元素值;

cout << *it << " ";

}

cout << endl;

return 0;

}

升序排列也可以用以下两种方式来实现:
sort(a.rbegin(), a.rend()); //从大到小排序
sort(a.begin(), a.end(), greater<int>()); //从大到小排序

运行:
Sample Input : 
5
5 2 1 4 3
Sample Output:
5 4 3 2 1

看以下程序:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <vector>
using namespace std;

int main()
{
    vector <int> v;
    int n;

while(~scanf("%d", &n)) {
        int Mc;
        for(int i=0; i<n; i++) {
            scanf("%d", &Mc);
            v.push_back(Mc);
        }
        sort(v.begin(), v.end(), greater<int>());
        //sor(v.rbegin(), v.end());
        vector <int> ::iterator it;
        for(it=v.begin(); it!=v.end(); it++) {
            cout << *it << " ";
        }
        cout << endl;
    }
    return 0;
}

排完序之后去重:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <vector>
using namespace std;

int main()
{
    vector <int> v;
    int n;

while(~scanf("%d", &n)) {
        int Mc;
        v.clear();
        for(int i=0; i<n; i++) {
            scanf("%d", &Mc);
            v.push_back(Mc);
        }
        sort(v.begin(), v.end(), greater<int>());
        //sor(v.rbegin(), v.end());
        int size = unique(v.begin(), v.end()) - v.begin();
        vector <int> ::iterator it;
        cout << "---size---" << size << endl;
        for(int i=0; i<size; i++) {
            cout << v[i] << " ";
        }
        cout << endl;
    }
    return 0;
}

运行:
Sample Input :
7
2 1 3 2 4 5 4
Sample Output:
---size---5
5 4 3 2 1

***向量的大小是否为空***

使用size()方法可以返回向量的大小,即元素的个数;

使用empty()方法可以返回向量是否为空;

以下是这两种方法的简单应用:

#include<iostream>

#include<vector>

using namespace std;

int main(int argc,char *argv[])

{

vector <int> v;

vector <int> :: iterator it;

for(int i=0; i<10; i++) {   //给向量赋值;

v.push_back(i);

}

cout << v.size() << endl;   //输出向量的大小;(即元素的个数)

cout << v.empty() << endl;  //判断是否为空,如果非空,则返回0,如果空,则返回1;

v.clear();

cout << v.empty() <<endl;

return 0;

}

*** vector向量容器的应用 ZOJ 1208***

字符串有些事对称的,有些不是对称的,请将那些对称的字符串安从小到大的顺序输出,字符串先以长度论大小,如果长度相等,再以ASCII码值为排序标准;

输入描述: 输入一个n,表示接下来有n组字符串,串长<=256; n<=1000;

输出描述: 根据每个字符串,输出对称的那些串,并且要求按从小到大的顺序输出;

输入样例:

7

123321

123454321

123

321

sdfsdfd

\\dd\\

121212

输出样例:

123321

\\dd\\

123454321

#include<iostream>

#include<vector>

#include<string>

#include<algorithm>

using namespace std;

bool cmp(const strings1, const string s2)

{

return (s1.length() != s2.length() ?s1.length() < s2.length() : s1 < s2);

}

int main()

{

vector <string> v;

vector <string>:: iterator it;

int n;

string s, t;

while(cin >> n) {

for(int i=0; i<n; i++) {

cin >> s;

t = s;

reverse(t.begin(), t.end());

if(t == s) {

v.push_back(s);

}

}

sort(v.begin(), v.end(), cmp);

for(it=v.begin(); it != v.end(); it++){

cout << *it<< endl;

}

}

return 0;

}

C++ vector迭代器的用法 学习笔记相关推荐

  1. c++ vector拷贝构造_vector------stl学习笔记一

    vector其中一个特点:内存空间只会增长,不会减小 援引C++ Primer:为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储. 设想一下,当vecto ...

  2. SQL语言的基本用法——学习笔记

    SQL语言的基本用法   结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系 ...

  3. java 集合框架、迭代器、比较器 学习笔记

    java集合框架总览 接口.实现类.算法的定义 常见的集合接口 Set和List的区别 常见的集合实现类 java.util包中定义的实现类 集合算法的概念 Collection Algorithms ...

  4. 计算机打字题错个标点扣几分,标点符号用法学习笔记:分隔号的基本用法和常见差错-逗号分隔值文件...

    分隔号 4.17.1 定义 标号的一种,标示诗行.节拍及某些相关文字的分隔. 4.17.2 形式 分隔号的形式是"/ ". 4.17.3 基本用法 4.17.3.1 诗歌接排时分隔 ...

  5. python datetime用法_python datetime用法学习笔记

    一.主要思路:1.把表示时间的str转换为datetime对象 2.操作datetime对象输出期望的时间格式 二.把表示时间的str转换为datetime对象语法:datetime.strptime ...

  6. CSS中flex的用法( 学习笔记 )

    flex( 弹性盒.伸缩盒 ) flex 的介绍 flex是CSS中的又一种布局手段,它主要用来代替浮动来完成页面的布局 flex可以使元素具有弹性,让元素可以随页面的大小的改变而改变 弹性容器 要使 ...

  7. C语言之continue和break用法学习笔记

    首先说明: continue 只能用于循环语句中,而break可用于循环和多重选择 switch 语句,两者都是辅助循环:尽管如此,如果 switch 语句在一个循环中,continue便可作为 sw ...

  8. SQL语言NULL用法学习笔记 (源自《SQL基础教程第2版》MICK 、孙淼、罗勇)

    一.算术运算(+.-. *. /) 包含NULL的算术运算中,不会报错且结果均为NULL.如: 5 + NULL: NULL / 9 ; NULL / 0 结果均为NULL 二.比较运算(=.< ...

  9. SV中关键字用法学习笔记

    本文章是CSDN博客上收集信息集合 1. event event事件是静态的同步对象句柄(可以像参数一样在子程序中传递),它用来同步多个并发的进程,比如某个进程等待着事件,而另一个进程则触发这个事件. ...

最新文章

  1. 曾在字节实习的程序员小姐姐,教你一步提取动漫线稿!比用PS更清晰
  2. 六个经典的HTML5面试问题奉上,太有用啦!
  3. 使用TortoiseSVN新建及合并分支图文教程
  4. 巨坑 之 pip install 和 conda install 的区别 以及 查看 和 修改 虚拟环境下运行路径
  5. CentOS系统下docker的安装与卸载
  6. 数据库:为什么阿里巴巴禁止使用存储过程?
  7. EF Core中高效批量删除、更新数据的Zack.EFCore.Batch发布三个新特性
  8. spring的几个通知(前置、后置、环绕、异常、最终)
  9. SpringBoot2 整合Ehcache组件,轻量级缓存管理
  10. LA2218半平面交
  11. WebService传输DataSet压缩与解压缩
  12. 九章算法班L6 Graph Search
  13. 定时任务Quartz 之 cron表达式(时间表达式)
  14. LaTeX引用参考文献——BibTex参考文献格式大全
  15. 手机管理服务器文件夹,手机管理服务器文件夹
  16. 最近插入法和最近邻点法
  17. java写足球游戏_月光软件站 - 编程文档 - Java - 足球战术之flyweight篇
  18. 上传声音 微信小程序_微信小程序录音文件保存,播放
  19. 使用Navicat复制MySQL数据库
  20. SFFAI召集人蓄势待发!你准备好了吗?

热门文章

  1. Linux编程视频课程Shell从入门到精通(完整版)
  2. 传男不传女-杜氏肌营养不良
  3. Airsim环境下的px4硬件在环仿真
  4. POI导出excel--设置字体,颜色,行高自适应,列宽自适应,锁住单元格,合并单元格
  5. Element对象_属性
  6. (十八)Python爬虫:XPath的使用
  7. AtCoder Beginner Contest 266 「A」「B 取模」「C 凸多边形」「D 状态机dp」「E 概率dp」「F 思维+dfs」
  8. 《我爱这土地》-艾青
  9. python scikit learn 关闭开源_scikit learn 里没有神经网络?
  10. Android自定义滑动刻度尺