vector 数组的用法

标签(空格分隔): vector STL C++ ACM


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 v;
(2). 创建时,指定容器的大小,如定义一个用来存储10个double类型元素的向量容器:
      vector v(10);   //注意:元素的下标为0~9, 另外每个元素具有指定的初始值;
(3). 创建一个具有n个元素的向量容器对象,每个元素具有指定的初始值;
      vector 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(const int 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;
} 

向量的大小是否为空

使用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;
}

转载于:https://www.cnblogs.com/Archger/p/8451656.html

vector 数组的用法相关推荐

  1. (C++)变长数组vector的常见用法

    目录 1. vector的定义 2. vector内的元素访问 3. vector常用函数 push_back(x) pop_back() size() clear() insert(it,x) er ...

  2. ArrayList、LinkedList、 Vector、Map 用法比较

    ArrayList和Vector是采用数组方式存储数据,此数组元素总数大于实际存储的数据个数以便增加和插入元素,二者都允许直接序号索引元素,但是插入数据要移动数组元素等内存操作,所以它们索引数据快.插 ...

  3. 《算法笔记》学习日记——6.1 vector的常见用法详解

    目录 6.1 vector的常见用法详解 问题 A: Course List for Student (25) 问题 B: Student List for Course (25) 小结 6.1 ve ...

  4. Vector初始化及用法

    vector类为内置数组提供了一种替代表示,与string类一样 vector 类是随标准 C++引入的标准库的一部分 ,为了使用vector 我们必须包含相关的头文件  : #include < ...

  5. 1---结构体中最后一个成员为[0]长度数组的用法

     结构体中最后一个成员为[0]长度数组的用法 2012-04-27 16:03:58 分类: C/C++ 这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针,用空数组有这样的优势:  1.不需要初始 ...

  6. php常用操作数组函数,PHP常见数组函数用法小结

    本文实例讲述了PHP常见数组函数用法.分享给大家供大家参考,具体如下: 1.array array_merge(array $array1 [, array  $array2 [, $array]]) ...

  7. Java中二维数组的用法(不定长二维数组)

    Java中二维数组的用法(不定长二维数组),即每个第二维的数组长度不一样. 1>代码如下: package com.demo.test;public class Test {public Tes ...

  8. linux 关联数组,Linux shell数组与关联数组的用法实例

    Linux shell数组与关联数组的用法实例 1. 关联数组 使用 declare -A(declare 的用法请使用 help 进行查看,help declare) 进行声明关联数组变量: $ d ...

  9. python中numpy的用法_Python中numpy多维数组的用法

    继上篇讲过numpy如何构建多维数组之后,今天我们来学习numpy多维数组的用法. 加法和减法操作要求操作双方的维数信息一致,均为M*N为数组方可正确执行操作. a = np.arange(4) 输出 ...

最新文章

  1. LeetCode简单题之在区间范围内统计奇数数目
  2. 用于自动泊车的鸟瞰图的边缘线的语义SLAM系统
  3. Request: Headless HTML rendering engine
  4. windows已添加Pin码仍提示添加的解决方法
  5. (转)java datetime date 类型
  6. P4198 楼房重建
  7. Spring MVC原理学习之how is return type handled
  8. java 接口 安全加密_Java中的安全加密
  9. 病从口入 这样吃小心癌症找上门
  10. Promise学习笔记
  11. 电脑技术吧_干货!12年技术员从零开始讲电脑硬件之攒机
  12. VB更改任何标题程序源代码
  13. BCS冬奥主题活动日:奥运网络安全成全球关注焦点
  14. 拓端tecdat|R语言ARIMA、GARCH 和 VAR模型估计、预测ts 和 xts格式时间序列
  15. Struts2通配符接收参数
  16. 话费通html模板,充话费好评怎么写 ——好评语模板
  17. 国家标准中常出入的IDT、MOD、EQV、NEQ是啥意思
  18. 转:乱谈Dotnet之武林秘籍
  19. Qt creator学习笔记(一)认识Qt
  20. ssl证书是什么,ssl证书有什么作用

热门文章

  1. SOEM(Simle Open EtherCAT Master)1.3.1
  2. android学习疑问汇兑
  3. git创建新的branch分支
  4. 基于频谱注意力机制和编码解码模型的时间序列分类研究
  5. esi浙江工业大学计算机,浙江第一!浙江工大Esi前1%学科增至8个!
  6. css动画唯美背景,小码哥-利用CSS3渐变实现唯美背景图
  7. 太卷了,详情页做这样,你让我怎么找工作?
  8. 初学画素描如何把球体画好
  9. 每日一题-正方形的判定
  10. Element-UI 和 VUE是什么?