C++入门笔记之std::vector容器详解

目录
  • 前言
  • 1. vector的构造函数原型:
  • 2. vector的赋值函数原型:
  • 3. vector的容量和大小函数原型:
  • 4. vector的插入和删除函数原型:
  • 5. vector的存取操作函数原型:
  • 6. vector的呼唤容器函数原型:
  • 总结

前言

vector实质是C++的一个类,与数组很相似,但是vector的优势是可以动态扩展,不需要考虑其内存大小。

定义:

向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。

特性:

1.顺序序列

顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。

2.动态数组

支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删

除元素的操作。

3.能够感知内存分配器的(Allocator-aware)

容器使用一个内存分配器对象来动态地处理它的存储需求。

1. vector的构造函数原型:

vector<T> data; //使用模板类,默认构造函数

vector(data.begin(),data.end()); //将data的【begin(),end())区间中的元素拷贝给本身,注意是数学中的前闭后开 区间

vector(n,elem); //将n个elem元素拷贝给本身

vector(const vector &data); //拷贝构造

#include <iostream>
#include <vector>

using namespace std;

void fun_print_vector(std::vector<int>&data)
{
    //std::vector<int>::iterator it; //可以用auto代替。
    for(auto it_data = data.begin();it_data != data.end();it_data++){
        std::cout << *it_data << " " << std::endl;
    }
}
void fun_vector()
{
    vector<int> data1; //默认构造
    data1.push_back(1);
    data1.push_back(2);
    data1.push_back(3);
    fun_print_vector(data1); //打印:1 2 3 

    vector<int> data2(data1.begin(),data1.end()); //通过区间进行构造
    fun_print_vector(data2); //打印:1 2 3 

    vector<int> data3(4,1);//4个1构造
    fun_print_vector(data3); //打印:1 1 1 1 

    vector<int> data4(data3); //拷贝构造
    fun_print_vector(data4); //打印:1 1 1 1 

}

2. vector的赋值函数原型:

vector& operator=(cost vector &data); //重载操作符

vector& assign(beg,end); //将[ beg,ed )区间中的数据拷贝赋值给本身

vector& assign(n,elem); //将n个elem拷贝赋值给本身

#include <iostream>
#include <vector>

using namespace std;

void fun_print_vector(std::vector<int>&data)
{
    //std::vector<int>::iterator it; //可以用auto代替。
    for(auto it_data = data.begin();it_data != data.end();it_data++){
        std::cout << *it_data << " " << std::endl;
    }
}
void fun_vector()
{
    vector<int> data1;
    for(int i = 0;i < 6;i++){
        data1.push_back(i);
    }
    fun_print_vector(data1); //打印 0 1 2 3 4 5

    vector<int> data2;
    data2 = data1;
    fun_print_vector(data2); //打印 0 1 2 3 4 5

    vector<int> data3;
    data3.assign(data1.begin(),data1.end());
    fun_print_vector(data3); //打印 0 1 2 3 4 5

    vector<int> data4;
    data3.assign(3,6);
    fun_print_vector(data4); //打印 6 6 6
}

3. vector的容量和大小函数原型:

empty(); //判断容器是否为空

capacity(); //容器的容量    capacity一定会大于等于size

size(); //返回容器中元素的个数

resize(int num); //重新指定容器的长度为num,若容器变长,则以默认值填充新的位置;若容器变短,则末尾超出的元素被删除

resize(int num,elem); //重新指定容器的长度为num,若容器变长,则以elem数值填充新的位置;若容器变短,则末尾超出的元素被删除

#include <iostream>
#include <vector>

using namespace std;

void fun_print_vector(std::vector<int>&data)
{
    //std::vector<int>::iterator it; //可以用auto代替。
    for(auto it_data = data.begin();it_data != data.end();it_data++){
        std::cout << *it_data << " " << std::endl;
    }
}
void fun_vector()
{
    vector<int> data1;
    for(int i = 0;i < 6;i++){
        data1.push_back(i);
    }
    fun_print_vector(data1); //打印 0 1 2 3 4 5

    if(data1.empty() == true){
        std::cout << "该容器是空" << std::endl;
    }else{
        std::cout << "该容器不是空" << std::endl;
        std::cout << "data1.capacity:" << data1.capacity() << std::endl;
        std::cout << "data1.size:" << data1.size() << std::endl;
    }
    data1.resize(10); //填充默认值0
    fun_print_vector(data1); //打印 0 1 2 3 4 5 0 0 0 0
    data1.resize(13,8); //填充数值8
    fun_print_vector(data1); //打印 0 1 2 3 4 5 0 0 0 0 8 8 8
    data1.resize(4);
    fun_print_vector(data1); //打印 0 1 2 3
}

4. vector的插入和删除函数原型:

push_back(elem); //尾部插入元素elem

pop_back(); //删除最后一个元素

insert(const_iterator pos, elem); //迭代器指向位置pos插入元素elem

insert(const_iterator pos, int count,elem); //迭代器指向位置pos插入count个元素elem

erase(const_iterator pos); //删除迭代器指向的元素

erase(const_iterator start,const_iterator end); //删除迭代器start到end之间的元素

clear(); //删除容器中所有元素

#include <iostream>
#include <vector>

using namespace std;

void fun_print_vector(std::vector<int>&data)
{
    //std::vector<int>::iterator it; //可以用auto代替。
    for(auto it_data = data.begin();it_data != data.end();it_data++){
        std::cout << *it_data << " " << std::endl;
    }
}
void fun_vector()
{
    vector<int> data1;
    for(int i = 0;i < 6;i++){
        data1.push_back(i);
    }
    fun_print_vector(data1); //打印 0 1 2 3 4 5
    data1.pop_back(); //尾删
    fun_print_vector(data1); //打印 0 1 2 3 4
    data1.insert(data1.begin(),22); //迭代器位置插入一个22
    fun_print_vector(data1); //打印 22 0 1 2 3 4
    data1.insert(data1.begin(),3,7); //迭代器位置插入三个22
    fun_print_vector(data1); //打印 7 7 7 22 0 1 2 3 4

    data1.erase(data1.begin()); //迭代器位置删除
    fun_print_vector(data1); //打印 7 7 22 0 1 2 3 4
    data1.erase(data1.begin(),data1.end()); //迭代器位置 区间 删除
    fun_print_vector(data1); //打印 空

    data1.clear(); //清空容器
    fun_print_vector(data1); //打印 空

}

5. vector的存取操作函数原型:

at(int idx); //返回索引idx所指的数据

operator []; //返回索引idx所指的数据

front(); //返回容器的第一个数据元素

back(); //返回容器的最后一个数据元素

#include <iostream>
#include <vector>

using namespace std;

void fun_print_vector(std::vector<int>&data)
{
    //std::vector<int>::iterator it; //可以用auto代替。
    for(auto it_data = data.begin();it_data != data.end();it_data++){
        std::cout << *it_data << " " << std::endl;
    }
}
void fun_vector()
{
    vector<int> data1;
    for(int i = 0;i < 6;i++){
        data1.push_back(i);
    }

    //利用[]方式访问vector中的元素
    for(int j = 0;j<data1.size();j++){
        std::cout << data1[j] << " " << std::endl;
    }
    //利用at方式访问vector中的元素
    for(int j = 0;j<data1.size();j++){
        std::cout << data1.at(j) << " " << std::endl;
    }

    std::cout << "第一个元素是:" << data1.front() << std::endl;
    std::cout << "最后一个元素是:" << data1.back() << std::endl;

}

6. vector的呼唤容器函数原型:

swap(vec); //将vecy与本身 两个容器中的元素互换

#include <iostream>
#include <vector>

using namespace std;

void fun_print_vector(std::vector<int>&data)
{
    //std::vector<int>::iterator it; //可以用auto代替。
    for(auto it_data = data.begin();it_data != data.end();it_data++){
        std::cout << *it_data << " " << std::endl;
    }
}
void fun_vector()
{
    vector<int> data1;
    for(int i = 0;i < 6;i++){
        data1.push_back(i);
    }
    fun_print_vector(data1); //打印 0 1 2 3 4 5

    vector<int> data2;
    for(int i = 6;i > 0;i++){
        data2.push_back(i);
    }
    fun_print_vector(data2); //打印 6 5 4 3 2 1 

    data1.swap(data2);
    fun_print_vector(data1); //打印 6 5 4 3 2 1
    fun_print_vector(data2); //打印 0 1 2 3 4 5 

}

总结

到此这篇关于C++入门笔记之std::vector容器的文章就介绍到这了,更多相关C++ std::vector容器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++入门笔记之std::vector容器详解

    目录 前言 1. vector的构造函数原型: 2. vector的赋值函数原型: 3. vector的容量和大小函数原型: 4. vector的插入和删除函数原型: 5. vector的存取操作函数原型: 6. vector的呼唤容器函数原型: 总结 前言 vector实质是C++的一个类,与数组很相似,但是vector的优势是可以动态扩展,不需要考虑其内存大小. 定义: 向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container).跟任意其它类型容器一样,它

  • C++中vector操作方式详解(多种方式)

    1. vector: 1.1 vector 说明 vector是向量类型,可以容纳许多类型的数据,因此也被称为容器 (可以理解为动态数组,是封装好了的类) 进行vector操作前应添加头文件#include <vector> 1.2 vector初始化: 方式1. //定义具有10个整型元素的向量(尖括号为元素类型名,它可以是任何合法的数据类型),不具有初值,其值不确定 vector<int>a(10); 方式2. //定义具有10个整型元素的向量,且给出的每个元素初值为1 vec

  • C++ 标准模板库 STL 顺序容器详解

    C++ 标准模板库 STL 顺序容器 容器 数据结构 顺序性 重复性 支持迭代器 vector 动态数组 无序 可重复 随机访问迭代器 deque 双向队列 无序 可重复 随机访问迭代器 list 双向链表 无序 可重复 双向迭代器 动态数组 vector ​ vector #include <vector> 动态数组:其元素在内存中是连续存放的,随机存取任何元素都可以在常数时间内完成,在该容器的尾部增删元素也几乎能够在常数时间内完成具有较好的性能. ​ 一个 vector 常用函数使用实例如

  • C++ Boost Fusion创建异构容器详解

    目录 一.说明 二.示例和代码 一.说明 标准库提供了许多容器,它们有一个共同点:它们是同类的.也就是说,标准库中的容器只能存储一种类型的元素. std::vector<int> 类型的向量只能存储 int 值,而 std::vector<std::string> 类型的向量只能存储字符串. Boost.Fusion 使创建异构容器成为可能.例如,您可以创建一个向量,其第一个元素是 int,第二个元素是字符串.此外,Boost.Fusion 提供了处理异构容器的算法.您可以将 Bo

  • C++ 11 std::function和std::bind使用详解

    cocos new 出新的项目之后,仔细阅读代码,才发现了一句3.0区别于2.0的代码: auto closeItem = MenuItemImage::create( "CloseNormal.png", "CloseSelected.png", CC_CALLBACK_1(HelloWorld::menuCloseCallback, this)); 2.0内的代码用的不是CC_CALLBACK_1而是menu_selector. CC_CALLBACK系列是3.

  • Java并发编程之同步容器与并发容器详解

    一.同步容器  1.Vector-->ArrayList vector 是线程(Thread)同步(Synchronized)的,所以它也是线程安全的: Arraylist是线程异步(ASynchronized)的,是不安全的: 2.Hashtable-->HashMap Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable: HashMap是非synchronized,这意味着HashMap是非线程安全的; 3.Coll

  • C++ STL容器详解之红黑树部分模拟实现

    目录 一.红黑树的概念 二.红黑树的性质 三.红黑树节点的定义 四.红黑树结构  五. 红黑树的插入操作 六.代码 总结 一.红黑树的概念 红黑树(Red Black Tree),是在计算机科学中用到的一种数据结构,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black. 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的. 二.红黑树的性质 1. 每个结点不是红色就是黑色: 2. 根节点是黑色的:

  • WinForm入门与基本控件使用详解

    目录 一.Winform入门 1.WinForm项目结构 2.窗口设计与控件布局 3.窗口事件 4.时间显示器小练习 二.WinForm布局开发 1. 手动布局解决自适应问题 2.WinForm布局属性 3.WinForm布局器 三.WinForm常用控件 1.界面展示 2.实体类 Student(封装信息) 3.逻辑事件代码Form.cs 四.图片框与项目资源 1.添加资源 2.图片框控件展示 一.Winform入门 WinForm 是 Windows Form 的简称,是基于 .NET Fr

  • C++模拟实现vector流程详解

    目录 模拟vector 总结 模拟vector 我们可以通过模板实现类似vector的类.我们实现一个StrVecTemp类,其内部通过allocator开辟空间,存储的类型用T来表示,T是模板类型. template <typename T> class StrVecTemp { public: StrVecTemp() : elements(nullptr), first_free(nullptr), cap(nullptr) {} //拷贝构造函数 StrVecTemp(const St

  • Vue 2.0入门基础知识之内部指令详解

    1.Vue.js介绍 当前前端三大主流框架:Angular.React.Vue.React前段时间由于许可证风波,使得Vue的热度蹭蹭地上升.另外,Vue友好的API文档更是一大特色.Vue.js是一个非常轻量级的工具,与其说是一个MVVM框架,不如说是一个js库.Vue.js具有响应式编程和组件化的特点.响应式编程,即保持状态和视图的同步,状态也可以说是数据吧:而其组件化的理念与React则一样,即"一切都是组件,组件化思想方便于模块化的开发,是前端领域的一大趋势. 2.内部指令 2-1.v-

随机推荐