zoukankan      html  css  js  c++  java
  • C++:标准模板库vector

    一:介绍

    vector是C++标准模板库,是一个容器,底层是数组,为连续内存。
    命名空间为std,所属头文件为<vector>   注意:不是<vector.h>
    vector存储数据时,会分配一个存储空间,如果继续存储,该分配的空间已满,就会分配一块更大的内存,把原来的数据复制过来,继续存储,这些性能也会一定程度上会有损耗

    二:常用操作

    容量:

    a.vector大小:vector.size()
    b.vector所占内存实际大小:vector.capacity()

    修改:

    a.尾部添加元素:vector.push_back()
    b.尾部删除元素:vector.pop_back()
    c.交换两个vector元素:vector.swap()
    d.清空vector元素:vector.clear()
    e.删除指定元素:vector.erase(it)

    迭代器:

    a.vector开始指针:vector.begin()
    b.vector尾部指针:vector.end()   注:最后一个元素的下一个位置,类似为NULL,不是容器的最后一个元素

    访问元素:

    a.下标访问:vector[1]  //不检查是否越界
    b.at方法访问:vector.at(1) //自动检查是否越界,如越界会抛出异常
    c.访问第一个元素:vector.front()
    d.访问最后一个元素:vector.back()

    三:存储

    简单存储

        //存储方式1
        vector<int> v1(10);
        for (int i=0; i<10; i++)
        {
            v1[i] = i;
        }
        //存储方式2
        vector<int> v2;
        for (int i=0; i<10; i++)
        {
            v2.push_back(i);
        }

    存储结构体和结构体指针

        struct Student
        {
            char name[32];
            int  age;
        };
     
        //存储结构体
        vector<Student> vStu1;
        for (int i=0; i<10; i++)
        {
            Student stu;
            strcpy(stu.name, "woniu201");
            stu.age = 30 + i;
            vStu1.push_back(stu);
        }
        //存储结构体指针
        vector<Student*> vStu2;
        for (int i=0; i<10; i++)
        {
            Student* pStu = (Student*)malloc(sizeof(Student));
            strcpy(pStu->name, "woniu201"); 
            pStu->age = 30 + i; 
            vStu2.push_back(pStu); 
        }

    四:vector遍历

        vector<int> v;
        for (int i=0; i<100; i++)
        {
            v.push_back(i);
        }
        //遍历方式1
        for (int i=0; i<100; i++)
        {
            int& a = v[i];
            printf("%d ", a);
        }
        //遍历方式2
        for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
        {
            int&a = *it;
            printf("%d ", a);
        }

    五:排序

    对vector整形进行排序

    #include "stdlib.h"
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    //升序比较函数
    int compare1(const int &a, const int &b)
    {
        return a < b;
    }
    
    //降序比较函数
    int compare2(const int &a, const int &b)
    {
        return a > b;
    }
    
    int main()
    {
        vector<int> v;
        for (int i=0; i<10; i++)
        {
            v.push_back(rand() % 10);
        }
    
        //遍历输出
        printf("排序前数据:");
        for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
        {
            printf("%d ", *it);
        }
    
        //升序排序
        sort(v.begin(), v.end(), compare1);
    
        //遍历输出
        printf("
    升序后数据:");
        for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
        {
            printf("%d ", *it);
        }
    
        //降序排序
        sort(v.begin(), v.end(), greater<int>());
    
        //遍历输出
        printf("
    降序后数据:");
        for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
        {
            printf("%d ", *it);
        }
    
        getchar();
        return 1;
    }

    对存放类成员变量排序

    #include <string>
    #include <vector>
    #include <algorithm>
    using namespace std;
     
    class Student {
    public:    
        Student(string n, int c) :name(n), core(c) {}
     
        string    name;
        int        core;
    };
     
    //升序比较函数
    bool compare1(const Student& s1, const Student& s2)
    {
        return s1.core < s2.core;
    }
     
    //降序比较函数
    bool compare2(const Student& s1, const Student& s2)
    {
        return s1.core > s2.core;
    }
     
     
    int main()
    {
        vector<Student> v;
        Student s1("aaaa", 97);
        Student s2("bbbb", 99);
        Student s3("cccc", 95);
     
        v.push_back(s1);
        v.push_back(s2);
        v.push_back(s3);
     
        printf("排序前数据:
    ");
        for (vector<Student>::iterator it = v.begin(); it != v.end(); it++)
        {
            printf("%s; %d
    ", ((*it).name).c_str(), (*it).core);
        }
     
        //升序排序
        sort(v.begin(), v.end(), compare1);
     
        printf("
    升序后的数据:
    ");
        for (vector<Student>::iterator it = v.begin(); it != v.end(); it++)
        {
            printf("%s; %d
    ", ((*it).name).c_str(), (*it).core);
        }
     
        //降序排序
        sort(v.begin(), v.end(), compare2);
        printf("
    降序后的数据:
    ");
        for (vector<Student>::iterator it = v.begin(); it != v.end(); it++)
        {
            printf("%s; %d
    ", ((*it).name).c_str(), (*it).core);
        }
        getchar();
        return 1;
    }

    六:查找

        vector<int>::iterator it = find(v.begin(), v.end(), 5);
        if(it != v.end())
        {
            cout << "found";
        }
        else
        {
            cout << "not found";
        }

    七:删除

        for(vector<int>::iterator it=v.begin(); it != v.end(); it++)
        {
            if(*it == 8)
            {
                it = v.erase(it);//it会++一次
                it--;       //删除完后需要--,否则最终循环越界
            }
        }

    八:释放内存

    存放整形vector释放

    	//存放整型
    	vector<int> v;
    	for (int i=0; i<100; i++)
    	{
    		v.push_back(i);
    	}
        //释放内存
        {
            vector<int> vEmpty;
            v.swap(vEmpty);
        }

    存放结构体vector释放

    	//存储结构体
    	vector<Student> vStu1;
    	for (int i=0; i<10; i++)
    	{
    		Student stu;
    		strcpy(stu.name, "woniu201");
    		stu.age = 30 + i;
    		vStu1.push_back(stu);
    	}
    	//释放内存    
            {
                vector<Student>
            }
    	 vector<Student> vEmpty;
             vStu1.swap(vEmpty);


    存放结构体指针vector释放

    	//存储结构体指针
    	vector<Student*> vStu2;
    	for (int i=0; i<10; i++)
    	{
    		Student* pStu = (Student*)malloc(sizeof(Student));
    		strcpy(pStu->name, "wangpengfei");
    		pStu->age = 30 + i;
    		vStu2.push_back(pStu);
    	}
    	//释放内存
    	for (vector<Student*>::iterator it = vStu2.begin(); it != vStu2.end(); it++)
    	{
    		if (NULL != *it)
    		{
    			delete *it;
    			*it = NULL;
    		}
    	}


    欢迎加群交流:C/C++开发交流

  • 相关阅读:
    jz2440 环境搭建遇到的问题
    Android开发10.2:UI组件AutoCompleteTextView(自动完成文本框)
    Android中RelativeLayout各个属性的含义
    【安装.net framework4.0】之安装失败,“安装时发生严重错误”
    【windows7 + Appium】之Appium安装以及其他工具安装配置
    【Selenium + Python】之OSError: [WinError 6] 句柄无效。
    【SoapUI、Postman、WebServiceStudio、Jmeter】接口测试工具结合测试webservice接口(发送XML格式参数)
    【Postman】接口测试工具:在谷歌浏览器安装插件方法以及使用说明
    【JMeter4.0学习(十一)】之JMeter对(Mysql、Oracle)数据库性能测试脚本开发
    【Selenium + Python】之 Excel、CSV、XML文件读取数据并运用数据百度查询
  • 原文地址:https://www.cnblogs.com/woniu201/p/11694613.html
Copyright © 2011-2022 走看看