vector相关操作总结

#include <iostream>
#include <vector>
using namespace std;

void print_vec(const std::vector<int>& vec)
{
    for (auto x : vec) {
        std::cout << ‘ ‘ << x;
    }
    std::cout << ‘\n‘;
}

int main()
{
    vector<int> vecInt;
    vecInt.push_back(1);
    vecInt.push_back(2);

    /////////一.元素访问 /////////////
    //1.at会进行越界检查 越界时,会报std::out_of_range的异常      //而[]操作, 会报断言错误, 这个try是抓取不了的
    try
    {
        cout << vecInt.at(2) << endl;
    }
    catch (std::out_of_range)
    {
        cout << "存在越界问题" << endl;
    }

    //2.front() 第一个元素
    cout << "第一个元素: " << vecInt.front() << ", 地址: "<<  &(vecInt.front())<< endl;
    //3.back() 最后一个元素
    cout << "最后一个元素: " << vecInt.back() << ", 地址: " << &(vecInt.back()) << endl;
    //4. data() 返回第一个元素对应的地址 !!记得带()
    cout << "data():" << vecInt.data() << endl;
    cout << "data+1:" << vecInt.data() + 1 << endl; //指针加1,就是指向下一个元素.

    /////////二.迭代器 /////////////
    //1.begin,cbegin 后者返回一个const_iterator,表示所指向的数据不能够修改,类似有常量指针吧.
    //2.end, cend 前者指向vector最后元素的后一元素,该元素表现为占位符,访问会导致未定义行为.
    //3.rbegin, rcbegin 前者指向容器最后元素,若vector为空,则返回值等于rend().

    /////////三.容量 /////////////
    //1.empty()
    cout << "Is empty?" << vecInt.empty() << endl;
    //2.size() 当前vector元素的个数
    cout << "size():" << vecInt.size() << endl;
    //3.max_size() 此值反映容器大小上的理论上限,可用的RAM总量会影响该值.
    cout << "Maximum size of a ‘vector‘ is" << vecInt.max_size() << endl;
    //4.reserve(new_cap) 增加vector的容量.若new_cap大于当前的capacity(),则分配新内存,此时所有迭代器和引用都被非法化,否则不做处理.
    //reserve()不更改vector的size().
    //5.capacity() 返回分配的容量值
    cout << "capacity(): " << vecInt.capacity() << endl;
    //6.shrink_to_fit请求移除未使用的容量
    vector<int> vecInt2;
    cout << "default capacity:" << vecInt2.capacity() << endl;
    vecInt2.reserve(100);
    cout << "after reserve capacity:" << vecInt2.capacity() << endl;
    vecInt2.clear();
    cout << "after clear capacity:" << vecInt2.capacity() << endl;
    vecInt2.shrink_to_fit();
    cout << "after shrink_to_fit capacity:" << vecInt2.capacity() << endl;

    /////////四.修改器 /////////////
    //1.clear() 清空vector,执行后size()为0
    //2.insert(pos, n, val),其中n可以省略:表示插入到pos前面,返回值是插入元素的迭代器.
    //insert(iterator pos, InputIt first, InputIt last);可以插入容器类型的元素的全部或者部分.
    std::vector<int> vec(3, 100);
    print_vec(vec);
    cout << "capacity1:" << vec.capacity() << endl;

    auto it = vec.begin();
    it = vec.insert(it, 200);
    print_vec(vec);
    cout << "capacity2:" << vec.capacity() << endl;

    it = vec.insert(it, 2, 300);
    print_vec(vec);
    cout << "capacity3:" << vec.capacity() << endl;

    // "it" 不再合法,获取新值:
    it = vec.begin();

    std::vector<int> vec2(2, 400);
    vec.insert(it + 2, vec2.begin(), vec2.end());
    print_vec(vec);
    cout << "capacity4:" << vec.capacity() << endl;

    int arr[] = { 501,502,503 };
    vec.insert(vec.begin(), arr, arr + 3);
    print_vec(vec);
    cout << "capacity5:" << vec.capacity() << endl;

    //3.erase(pos) 移除位于pos的元素
    //erase(first, last) 移除范围[first, last)的元素
    //会非法化位于擦除点或之后的迭代器,包含end()迭代器.

    //4.push_back
    //5.pop_back 移除末尾元素
    //swap(vector &other) 将内容与other交换.
    vector<int> vecInt3;
    vecInt3.swap(vecInt);
    cout << "vecInt:";
    print_vec(vecInt);
    cout << "vecInt3:";
    print_vec(vecInt3);
    return 0;
}

原文地址:https://www.cnblogs.com/Stephen-Qin/p/12690302.html

时间: 2024-08-30 05:08:12

vector相关操作总结的相关文章

STL中的Vector相关用法

STL中的Vector相关用法 标准库vector类型使用需要的头文件:#include <vector>. vector 是一个类模板,不是一种数据类型,vector<int>是一种数据类型. Vector的存储空间是连续的,list不是连续存储的. 1. 定义和初始化 vector< typeName > v1; //默认v1为空,故下面的赋值是错误的v1[0]=5;//v2是v1的一个副本,若v1.size()>v2.size()则赋值后v2.size()被

Scala学习(三)----数组相关操作

数组相关操作 摘要: 本篇主要学习如何在Scala中操作数组.Java和C++程序员通常会选用数组或近似的结构(比如数组列表或向量)来收集一组元素.在Scala中,我们的选择更多,不过现在我们先假定不关心其他选择,而只是想马上开始用数组.本篇的要点包括: 1. 若长度固定则使用Array,若长度可能有变化则使用ArrayBuffer 2. 提供初始值时不要使用new 3. 用()来访问元素 4. 用for (elem<-arr)来遍历元素 5. 用for (elem<-arr if…)…yie

STL之heap相关操作算法

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 堆(heap)是一种非常重要的数据结构(这里我们讨论的是二叉堆),它是一棵满足特定条件的完全二叉树,堆的定义如下: 堆是一棵树完全二叉树,对于该完全二叉树中的每一个结点x,其关键字大于等于(或小于等于)其左右孩子结点,而其左右子树均为一个二叉堆. 在上述的定义中,若堆中父亲结点关键字的值大于等于孩子结点,则称该堆为大顶堆:若堆中父亲结点关键子的值小于等于孩子结点,则称该堆为小顶堆. 由于堆是一棵完全二叉树,所以我们可以很轻易地用一个数组存储堆中

Scala详解---------数组相关操作

Scala中提供了一种数据结构-数组,其中存储相同类型的元素的固定大小的连续集合.数组用于存储数据的集合,但它往往是更加有用认为数组作为相同类型的变量的集合. 取替声明单个变量,如number0, number1, ..., 和number99,声明一个数组变量,如号码和使用numbers[0],numbers[1],...,numbers[99]表示单个变量.本教程介绍了如何声明数组变量,创建数组和使用索引的过程变量数组.数组的第一个元素的索引是数字0和最后一个元素的索引为元素的总数减去1.

二叉树的相关操作

#include<stdio.h> #include<malloc.h> #define MAXSIZE 20 typedef char TEelemtype; typedef struct BiTNode{ TEelemtype data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; //队列的方式 typedef struct queueelem { BiTNode* b[MAXSIZE]; int front,rear;

(二十四)linux新定时器:timefd及相关操作函数

timerfd是Linux为用户程序提供的一个定时器接口.这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景. 一,相关操作函数 #include <sys/timerfd.h> int timerfd_create(int clockid, int flags); int timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itim

二叉树各种相关操作(建立二叉树、前序、中序、后序、求二叉树的深度、查找二叉树节点,层次遍历二叉树等)(C语言版)

将二叉树相关的操作集中在一个实例里,有助于理解有关二叉树的相关操作: 1.定义树的结构体: 1 typedef struct TreeNode{ 2 int data; 3 struct TreeNode *left; 4 struct TreeNode *right; 5 }TreeNode; 2.创建根节点: 1 TreeNode *creatRoot(){ 2 TreeNode * root =(TreeNode *)malloc(sizeof(TreeNode)); 3 if(NULL=

linux下进程相关操作

一.定义和理解 狭义定义:进程是正在运行的程序的实例. 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动. 进程的概念主要有两点: 第一,进程是一个实体.每一个进程都有它自己的地址空间,一般情况下,包括文本区域.数据区域和堆栈区域.文本区域存储处理器执行的代码:数据区域存储变量和进程执行期间使用的动态分配的内存:堆栈区域存储着活动过程调用的指令和本地变量. 第二,进程是一个“执行中的程序”.程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们

android DataBase的相关操作(建立表结构和创建表)

先建立一个table的基类: public abstract class DbBaseTable { private static final String TAG = "DbBaseTable"; /** * @return the DB table name */ abstract String getName(); /** * Creates the DB table according to the DB scheme * * @param db */ abstract voi