• C++STL之Vector向量详解,用法和例子 一起学习 一起加油


                                                                                    C++ STL之vector用法总结

    • 1.vector是可变大小数组的序列容器
    • 2.像数组一样,vector也采用连续储存空间来储存元素,就是说可以采用下标
    • 对数组进行访问,大小可变,会被容器自动处理
    • 3.本质讲,vector使用动态分配数组来存储它的元素。
    • 当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。
    • 其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,
    • 这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,
    • vector并不会每次都重新分配大小。
    • 4.与其它动态序列容器相比(deques, lists and forward_lists),
    • vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。
    • 对于其它不在末尾的删除和插入操作,效率更低。
    • 比起lists和forward_lists统一的迭代器和引用更好。

    #include<iostream>
    #include<vector>
    #include<algorithm>

    using namespace std;
    //vector的声明及初始化

     1 vector<int> vec; //声明一个int型向量
     2 vector<int> vec1(5); //声明一个初始大小为5的int向量
     3 vector<int> vec2(10, 1); //声明一个初始大小为10且值都为1的向量
     4 vector<int> vec3(vec1); //声明并用vec1向量初始化vec3向量
     5 vector<int> tmp(vec2.begin(), vec2.begin() + 3); //用向量vec的第0个到第二个初始化tmp
     6 int arr[5] = { 1,2,3,4,5 };
     7 vector<int> vec4(arr, arr+5); //将arr数组的元素用于初始化vec向量
     8 //说明::::不包括arr[4]元素,末尾指针都是指结束元素的下一个元素
     9 //为了和vec.end()指针统一
    10 vector<int> vec5(arr, &arr[4]);


    //vector基本操作
    //1.容量
    /*
    向量大小:vec.size()
    向量最大容量:vec.max_size()
    更改向量大小: vec.resize()
    向量真实大小: vec.cappcity()
    向量判空: vec.empty()
    减少向量大小到满足元素所占储存空间的大小 : vec.shrink_to_fit();
    */

    测试代码 

     1 void main() {
     2 cout << vec4.size() << ends <<vec4.capacity() <<ends<<vec.max_size()<< endl;
     3 cout << vec4.empty() << endl; //空为1,非空为0
     4 cout << vec.empty() << endl;
     5 vec.push_back(32);
     6 for (int i = 0; i < 40; i++)
     7 {
     8 vec.push_back(i);
     9 }
    10 cout << vec.size() << ends << vec.capacity() << endl;
    11 vec.shrink_to_fit();
    12 cout << vec.capacity() << endl;
    13 for(int i=0;i<vec4.size();i++)
    14 cout << vec4[i] << endl;
    15 for (int i = 0; i<vec5.size(); i++)
    16 cout << vec5[i] << endl;
    17 }

    //2.修改
    /*
    多个元素赋值: vec.assign() //类似与初始化时用数组赋值
    末尾添加元素:vec.push_back()
    末尾删除元素 vec.pop_back()
    任意位置插入元素 vec.insert()
    任意位置删除元素: vec.erase()
    交换两个向量元素 vec.swap()
    清空向量元素 vec.clear()
    */

    测试代码 

     1 int main() {
     2 int i;
     3 vec2=vec4; //vector可以直接用另一个赋值;
     4 for (i = 0; i < vec2.size(); i++) {
     5 cout << vec2[i] << endl;
     6 }
     7 cout << vec2.size() << ends << vec2.capacity() << endl;
     8 //vector assign() 的三种用法
     9 vec2.assign(3,7);    //3个7
    10 vec2.assign(arr, arr + 3); //迭代器 数组名 0 1 2 不包括arr+3
    11 vec2.assign({ 1,56,89 }); //无名数组的方法进行赋值
    12 //vector insert()函数的三种用法
    13 vector<char> avector;
    14 for (int i = 0; i < 10; i++) {
    15 avector.push_back(i + 65);
    16 }
    17 avector.insert(avector.begin(), 5, 'C');// 1. 在指定loc 前插入val元素,返回指向这个元素的迭代器
    18 avector.insert(avector.begin() + 2, 6); //2. 在指定位置loc前插入num个值为val的元素
    19 avector.insert(avector.begin()+1,avector.begin(),avector.end()); //3.在指定位置loc前插入区间(start,end) 的所有元素
    20 vector<char>::iterator it = avector.begin();
    21 for (; it != avector.end(); it++) {
    22 cout << *it << ends;
    23 }
    24 cout << endl;
    25 
    26 //vector erase()函数的用法
    27 //earse的返回值是返回被删除元素向后的一个元素
    28 //vector中erase的作用是删除掉某个位置position或一段区域
    29 //(begin, end)中的元素,减少其size。
    30 for (it = avector.begin(); it != avector.end();) {
    31 it = avector.erase(it);
    32 }
    33 for (; it != avector.end(); it++) {
    34 cout << *it << ends;
    35 }
    36 cout << endl;
    37 //vector swap()用法 
    38 cout << tmp.size() << ends << tmp.capacity() << endl;
    39 tmp.erase(tmp.begin()+1);
    40 cout << tmp.size() << ends << tmp.capacity() << endl;
    41 tmp.swap(vec);
    42 cout << tmp.size() << ends << tmp.capacity() << endl;
    43 for (i = 0; i < vec2.size(); i++) {
    44 cout << vec2[i] << endl;
    45 }
    46 vec2.shrink_to_fit();
    47 cout << vec2.size() << ends << vec2.capacity() << endl;
    48 return 0;
    49 }

    //3.迭代器
    /*
    开始指针vec.begin()
    末尾指针: vec.end()
    指向常量的开始指针: vec.cbegin()
    指向常量的末尾指针: vec.cend()
    */

    //4.元素的访问
    /*
    下标访问: vec[1] //并不会检查是否越界
    at方法访问: vec.at[1] //两者的区别就是at会检查是否越界,
    是就会抛出out of range异常
    访问第一个元素: vec.front()
    访问最后一个元素: vec.back()
    ******* C++11的特性
    返回一个指针: int*p=vec.data() // vector在内存中是一个数组,
    可以返回一个指针指向这个数组
    */

    测试代码 

     1 int main() {
     2 vector<char> ave,ml;
     3 for (int i = 0; i < 26; i++) {
     4 ave.push_back(i + 65);
     5 }
     6 vector<char>::iterator it = ave.begin();
     7 for (; it != ave.end(); it++) {
     8 cout << *it << ends;
     9 }cout << endl;
    10 //元素翻转
    11 reverse(ave.begin(), ave.end());
    12 for (it = ave.begin(); it != ave.end(); it++) {
    13 cout << *it << ends;
    14 }cout << endl;
    15 //reverse_copy() reverse_copy(sourceBeg,sourceEnd,destBeg)
    16 //将源区间soureBeg sourceEnd 内的元素复制到以destBeg起始的目标区间
    17 //并颠倒安置次序
    18 reverse_copy(ave.begin(), ave.end(),ml.begin());
    19 //元素排序
    20 //sort(vec.begin(), vec.end());
    21 for (it = ml.begin(); it != ml.end(); it++) {
    22 cout << *it << ends;
    23 }cout << endl;
    24 return 0;
    25 }

    本人水平有限如有问题欢迎指出

  • 相关阅读:
    spring aop 之链式调用
    Java中的java.lang.Class API 详解
    Java 内省(Introspector)和 BeanUtils
    Small Spring系列一:BeanFactory(一)
    (C#) 多线程访问探讨,如果保证线程安全?
    (C#) 多线程访问int, bool 等值类型变量
    (WCF) 利用WCF实现两个Process之间的通讯。
    (PowerShell) 重命名文件
    JavaScript : Array assignment creates reference not copy
    (C#) 表达式树
  • 原文地址:https://www.cnblogs.com/Cherrison-Time/p/9942003.html
Copyright © 2020-2023  润新知