[关闭]
@Archger 2016-06-11T16:25:12.000000Z 字数 6172 阅读 2429

vector 数组的用法

vector STL C++ ACM


STL标准模板库提供三种类型的组件:


容器,迭代器和算法,他们都支持泛型程序设计标准; 

容器主要分为两大类:


顺序容器和关联容器。
顺序容器有:(vector,list,deque和string等)是一系列元素的有序集合。
关联容器:(set, multiset,map, multimap)包含查找元素的键值;
迭代器的作用是遍历容器;
在进行多组测试数据是一定要注意:在每组测试之后都要清空,否则容器会保留上一次测试的数据;(例最下) 

Vector 使用 I:

  1. #include <iostream>
  2. #include <vector>  //向量需要;
  3. #include <cstdio>
  4. #include <numeric>  //accumulate算法需要;
  5. using namespace std;
  6. int a[10005];
  7. int main()
  8. {
  9. vector <int> v;   //定义向量v;
  10. vector<int>::iterator it;  //定义迭代器it;
  11. int n;
  12. while(~scanf("%d", &n))
  13. {
  14.         for(int i=0; i<n; i++) {  //赋值;
  15.             scanf("%d", &a[i]);
  16.             v.push_back(a[i]);
  17.         }
  18.         for(it=v.begin(); it!=v.end(); it++) {//使用iterator迭代器顺序遍历所有元素;
  19.             printf("%d ", *it);  //输出迭代器当前位置上的元素值;
  20.         }
  21.         printf("\n");
  22.         printf("%d\n",accumulate(v.begin(), v.end(), 0));  //统计并输出向量所有元素的和;
  23.     }
  24.     return 0;
  25. }

实现斐波那契数列:

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. int main()
  5. {
  6.     vector <unsigned int> v;
  7.     unsigned int n;
  8.     v.push_back(0);
  9.     v.push_back(1);
  10.     for(int i=2; i<50; i++) {
  11.         v.push_back(v[i-1]+v[i-2]);
  12.     }
  13.     while(cin >> n) {
  14.         cout << v[n] << endl;
  15.     }
  16.     return 0;
  17. }

ZOJ 1179 *

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <numeric>
  4. #include <vector>
  5. using namespace std;
  6. int main()
  7. {
  8.     vector <double> v;
  9.     int n;
  10.     while(~scanf("%d", &n)) {
  11.         double m;
  12.         v.clear();
  13.         for(int i=0; i<n; i++) {
  14.             scanf("%lf", &m);
  15.             v.push_back(m);
  16.         }
  17.         double sum =(double)accumulate(v.begin(), v.end(), 0)/n;
  18.         printf("%.3lf\n", sum);
  19.     }
  20.     return 0;
  21. }

创建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;

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4. int main(int argc,char *argv[])
  5. {
  6.     vector<int>v;
  7.     v.push_back(2);
  8.     v.push_back(7);
  9.     v.push_back(9);
  10.     return 0;
  11. }

下标方式访问vector元素

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

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4. int main(int argc,char *argv[])
  5. {
  6.     vector<int>v(3);
  7.     v[0] = 2;
  8.     v[1] = 7;
  9.     v[2] = 9;
  10.     cout << v[0] << " "<< v[1] << " " << v[2] << endl;
  11.     return 0;
  12. }

迭代器方式访问vector元素

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

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4. int main(int argc,char *argv[])
  5. {
  6.     vector<int>v(3);
  7.     v[0] = 2;
  8.     v[1] = 7;
  9.     v[2] = 9;
  10.     //定义迭代器变量
  11.     vector <int> :: iterator it;
  12.     for(it=v.begin(); it != v.end(); it++) {
  13.         //输出迭代器上的元素值;
  14.         cout << *it << " ";
  15.     }
  16.     cout << endl;  //换行;
  17.     return 0;
  18. }

vector元素插入

      insert()插入方法可以在vector对象的任意位置插入一个新的元素,同时,vector自动扩张一个元素的空间,插入位置后的所有元素一次向后挪动一个位置;
      要注意的是, insert()方法要求插入的位置,是元素的迭代器位置,而不是元素的下标 ;
运行结果:8 2 1 7 9 5 3

  1. #include<iostream>
  2. #include<vector>
  3. using namespacestd;
  4. int main(int argc,char *argv[])
  5. {
  6.     vector <int> v(3);
  7.     vector <int> :: iterator it;  //定义迭代器变量;
  8.     v[0] = 2;
  9.     v[1]= 7;
  10.     v[2] = 9;
  11.     v.insert(v.begin(), 8);  //在最前面插入一个新元素,元素值为8;
  12.     v.insert(v.begin()+2, 1);  //在第二个元素后插入新元素1;
  13.     v.insert(v.end(), 3);  //在向量末尾追加新元素3;
  14.     v.insert(v.end()-1, 5);   //在向量倒数第二个元素后面插入一个新元素5;
  15.     for(it=v.begin(); it != v.end(); it++) {
  16.         //输出迭代器上的元素值;
  17.         cout << *it << "";
  18.     }
  19.     cout << endl;  //换行;
  20.     return 0;
  21. }

vector元素删除

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

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4. int main(int argc,char *argv[])
  5. {
  6.     vector <int> v(10);
  7.     vector <int> :: iterator it;
  8.     for(int i=0; i<10; i++) {
  9.         v[i] = i;
  10.     }
  11.     v.erase(v.begin()+2);   //删除第二个元素,从0开始计数;
  12.     for(it=v.begin(); it != v.end(); it++) {
  13.         cout << *it << "";
  14.     }
  15.     cout << endl;
  16.     v.erase(v.begin()+1, v.begin()+5);   //删除区间[1, 5)的元素;
  17.     for(it=v.begin(); it != v.end(); it++) {
  18.         cout << *it<< " ";
  19.     }
  20.     cout << endl;
  21.     v.clear(); //删除全部元素;(清空向量)
  22.     cout << v.size() << endl;  //输出姓梁大小;
  23.     return 0; 
  24. }

vector元素反向排列

reverse反向排列算法,需要定义头文件include<algorithm>
reverse算法可将向量中某段迭代器区间元素反向排列;

  1. #include<iostream>
  2. #include<vector>
  3. #include<algorithm>
  4. using namespacestd;
  5. int main(int argc,char *argv[])
  6. {
  7.     vector <int> v(10);
  8.     vector <int> :: iterator it;
  9.     for(int i=0;i<10; i++) {
  10.         v[i] = i;
  11.     }
  12.     for(it=v.begin(); it != v.end(); it++) {
  13.         cout << *it << "";
  14.     }
  15.     cout << endl;
  16.     reverse(v.begin(), v.end());  //反向排列向量的从头到尾间的元素;
  17.     for(it=v.begin(); it != v.end(); it++) {
  18.         cout << *it << "";
  19.     }
  20.     cout << endl;
  21.     return 0;
  22. }

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

使用sort算法必须添加头文件#include <algorithm>;
sort算法要求使用随机访问迭代器进行排序,在默认的情况下,对向量元素进行升序排列;
跟对数组排序的过程相似;

  1. #include<iostream>
  2. #include <vector>
  3. #include<algorithm>
  4. using namespace std;
  5. int main(int argc,char *argv[])
  6. {
  7.     vector <int> v;
  8.     vector <int> :: iterator it;
  9.     for(int i=0; i<10; i++) {
  10.         v.push_back(9-i);
  11.     }
  12.     for(int i=0; i<10; i++) {  //输出排序前的元素值;
  13.         cout << v[i] << "";
  14.     }
  15.     cout << endl;
  16.     sort(v.begin(), v.end());  //升序排列;
  17.     for(it=v.begin(); it != v.end(); it++){  //输出排序后的元素值;
  18.         cout << *it << "";
  19.     }
  20.     cout << endl;
  21.     return 0;
  22. }

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

  1. #include<iostream>
  2. #include<vector>
  3. #include<algorithm>
  4. using namespacestd;
  5. bool cmp(const int a, const int b)
  6. {
  7.     return a > b;
  8. }
  9. int main(int argc,char *argv[])
  10. {
  11.     vector <int> v;
  12.     vector <int> :: iterator it;
  13.     for(int i=0; i<10; i++) {
  14.         v.push_back(i);
  15.     }
  16.     for(int i=0; i<10; i++) {  //输出排序前的元素值;
  17.         cout << v[i] << " ";
  18.     }
  19.     cout << endl;
  20.     sort(v.begin(), v.end(), cmp);  //升序排列;
  21.     for(it=v.begin(); it != v.end(); it++){  //输出排序后的元素值;
  22.        cout << *it << " ";
  23.     }
  24.     cout << endl;
  25.     return 0;
  26. }

向量的大小是否为空

使用size()方法可以返回向量的大小,即元素的个数;
使用empty()方法可以返回向量是否为空;
以下是这两种方法的简单应用:

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4. int main(int argc,char *argv[])
  5. {
  6.     vector <int> v;
  7.     vector <int> :: iterator it;
  8.     for(int i=0; i<10; i++) {   //给向量赋值;
  9.         v.push_back(i);
  10.     }
  11.     cout << v.size() << endl;   //输出向量的大小;(即元素的个数)
  12.     cout << v.empty() << endl;  //判断是否为空,如果非空,则返回0,如果空,则返回1;
  13.     v.clear();
  14.     cout << v.empty() <<endl;
  15.     return 0;
  16. }

vector向量容器的应用 ZOJ 1208

字符串有些事对称的,有些不是对称的,请将那些对称的字符串安从小到大的顺序输出,字符串先以长度论大小,如果长度相等,再以ASCII码值为排序标准;
输入描述: 输入一个n,表示接下来有n组字符串,串长<=256; n<=1000;
输出描述: 根据每个字符串,输出对称的那些串,并且要求按从小到大的顺序输出;
输入样例:

7 
123321 
123454321 
123 
321 
sdfsdfd 
\\dd\\ 
121212 
输出样例: 
123321 
\\dd\\ 
123454321 
  1. #include<iostream>
  2. #include<vector>
  3. #include<string>
  4. #include<algorithm>
  5. using namespace std;
  6. bool cmp(const strings1, const string s2)
  7. {
  8.     return (s1.length() != s2.length() ?s1.length() < s2.length() : s1 < s2);
  9. }
  10. int main()
  11. {
  12.     vector <string> v;
  13.     vector <string>:: iterator it;
  14.     int n;
  15.     string s, t;
  16.     while(cin >> n) {
  17.         for(int i=0; i<n; i++) {
  18.             cin >> s;
  19.             t = s;
  20.             reverse(t.begin(), t.end());
  21.             if(t == s) {
  22.                 v.push_back(s);
  23.             }
  24.         }
  25.         sort(v.begin(), v.end(), cmp);
  26.         for(it=v.begin(); it != v.end(); it++){
  27.             cout << *it<< endl;
  28.         }
  29.     }
  30.     return 0;
  31. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注