【C++】vector容器概述

本文详细介绍了C++标准库中的vector容器,包括其基本概念、动态空间管理、迭代器使用、数据结构特性,以及示例展示了如何使用vector进行数据存储、迭代、排序和内存管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. vector容器基本概念

   vector的数据安排以及操作方式,与数组非常相似,两者的唯一差别在于空间的运用的灵活性数组是静态空间,一旦配置了就不能改变,vector是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新元素。

2. vector迭代器

   vector维护一个线性空间,所以不论元素的型别如何,普通指针都可以作为vector的迭代器。vector支持随机存取提供的是随机访问迭代器。例如普通迭代器使用为vector<int>::iterator it1=v.begin();、反转迭代器使用为vector<int>::reverse_iterator it2=v.rbegin();、只读迭代器使用为vector<int>::const_iterator it3=v.end();

3. vector的数据结构

   vector所采用的数据结构非常简单,线性连续空间,它以两个迭代器 _Myfirst_Mylast分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器 _Myend指向整块连续内存空间的尾端,一个vector的容量永远大于或等于其大小,一旦容量等于大小,便是满载,下次再有新增元素,整个vector容器就得扩容
  
  扩容是动态增加大小,并不是在原空间之后续接新空间(因为无法保证原空间之后尚有可配置的空间),而是一块更大的内存空间,然后将原数据拷贝新空间,并释放原空间。因此,对vector的任何操作,一旦引起空间的重新配置,指向原vector的所有迭代器就都失效了
  
  鉴于vector会自动扩容,在实际使用中可以使用v.resize(n)进行空间的更改以及v.reserve(n)进行空间的提前预留。

4. vector容器基本使用


#include<iostream>
#include<vector>//单端动态数组 容器头文件
#include<algorithm>//算法头文件,仅随机访问迭代器可以使用
using namespace std;
//自定义数据类型
class Person {
public:
    Person(string name, int age) {
        this->m_Name = name;
        this->m_Age = age;
    }
    string m_Name;
    int m_Age;
};
void myPrint(int num) {//输出函数
    cout << num << endl;
}
//使用仿函数
class my_Print{
	public:
		void operator()(int num){ //输出函数仿函数
    	cout << num << endl;
		}
};
bool myCompare(Person& p1, Person& p2) {//规定的排序方式函数,按照TRUE的方式排序
	if (p1.m_Age == p2.m_Age) {
		return p1.m_Name < p2.m_Name;
	}
	return p1.m_Age < p2.m_Age;
}
//使用仿函数
class my_Compare{
	public:
		bool operator()(Person& p1, Person& p2) {//按照TRUE的方式排序
			if (p1.m_Age == p2.m_Age) {
				return p1.m_Name < p2.m_Name;
			}
			return p1.m_Age < p2.m_Age;
		}
};
void test1() {
    vector<int> v1;//创建vector容器vector<T> v采用模板类实现,默认构造函数
    //插入数据
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    //利用迭代器遍历 
    //v.begin()开始迭代器 指向第一个元素位置
    vector<int>::iterator itBegin = v1.begin();
    //v.end()结束迭代器 指向最后一个元素下一个位置
    vector<int>::iterator itEnd = v1.end();
    while (itBegin != itEnd)
    {
        cout << *itBegin << endl;
        itBegin++;
    }
    //利用循环遍历
    for (vector<int>::iterator it = v1.begin(); it != v1.end();it++) {
        cout << *it << endl;
    }
   //利用循环逆序遍历 v.rbegin()迭代器 指向最后一个元素,v.rend()迭代器 指向首个元素前一个位置
   for(vector<int>::reverse_iterator it=v1.rbegin();it!=v1.rend();it++){
		cout<<*it<<endl;
	}
    //使用遍历算法,将遍历到的数据传入函数myPrint
    for_each(v1.begin(), v1.end(), myPrint);
    //使用仿函数 for_each(v1.begin(), v1.end(), my_Print());
    //使用排序算法进行排序
    sort(v1.begin(), v1.end());
}
void test2() {
    vector<Person> v2;
    Person p1("AAA", 11);
    Person p2("BBB", 22);
    Person p3("CCC", 33);

    v2.push_back(p1);
    v2.push_back(p2);
    v2.push_back(p3);
    //(*it).m_Name==it->m_Name
    for (vector<Person>::iterator it = v2.begin(); it != v2.end(); it++) {
        cout << "姓名--" << it->m_Name << " 年龄--" << it->m_Age << endl;
    }
    //自定义类型使用排序算法sort必须传入排序规则函数才可
    sort(v2.begin(), v2.end(),myCompare);//对vector进行排序,传入排序规则函数
    //使用仿函数 sort(v2.begin(), v2.end(),my_Compare());
}
//添加指针类型
void test3() {
    vector<Person*> v3;
    Person p1("AAA", 11);
    Person p2("BBB", 22);
    Person p3("CCC", 33);

    v3.push_back(&p1);
    v3.push_back(&p2);
    v3.push_back(&p3);

    for (vector<Person*>::iterator it = v3.begin(); it != v3.end(); it++) {
        cout << "姓名--" << (*it)->m_Name << " 年龄--" << (*it)->m_Age << endl;
    }
}
//容器嵌套
void test4() {
    vector<vector<int>> v4;
    vector<int> v5;
    vector<int> v6;
    vector<int> v7;

    for (int i = 0; i < 5; i++) {
        v5.push_back(i + 1);
        v6.push_back(i + 10);
        v7.push_back(i + 100);
    }
    //小容器插入大容器
    v4.push_back(v5);
    v4.push_back(v6);
    v4.push_back(v7);
    //遍历
    for (vector<vector<int>>::iterator it = v4.begin(); it != v4.end(); it++) {
       //*it==vector<int> ...
        for (vector<int>::iterator it1 = it->begin(); it1 != it->end(); it1++) {
            cout << *it1 << " ";
        }
        cout << endl;
    }
}
int main() {
    //test1();
    //test2();
    test3();
    test4();
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值