C++学习(19)—— vector容器

1.vector基本概念

功能:

  • vector数据结构和数组非常相似,也成为单端数组

vector与普通数组区别:

  • 不同之处在于数组是静态空间,而vctor可以动态扩展

动态扩展:

  • 并不是在原空间之后续借新空间,而是找更大的内存空间,然后将原数据拷贝到新空间,释放原空间
  • vector容器的迭代器是支持随机访问的迭代器

?

2.vector构造函数

功能描述:

  • 创建vector容器

函数原型:

  • vector<T> v; //采用模板实现类实现,默认构造函数
  • vector(v.begin(), v.end()); //将[v.begin(), v.end())区间中的元素拷贝给本身
  • vector(n, elem); //构造函数将n个elem拷贝给本身
  • vector(const vector &vec); //拷贝构造函数
#include<iostream>
#include<vector>
using namespace std;

void printVector(vector<int>v) {
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}

void test01() {
    //默认构造
    vector<int>v1;
    for (int i = 0; i < 10; i++) {
        v1.push_back(i);
    }
    printVector(v1);

    //通过区间方式进行构造
    vector<int>v2(v1.begin(), v1.end());
    printVector(v2);

    //n个elem方式构造
    vector<int>v3(10, 100);
    printVector(v3);

    //拷贝构造
    vector<int>v4(v3);
    printVector(v4);
}

int main() {
    test01();
    system("pause");
    return 0;
}

?

3.vector赋值操作

功能描述:

  • 给vector容器进行赋值

函数原型:

  • vector& operator=(const vector &vec); //重载等号操作符
  • assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身
  • assign(n,elem); //将n个elem拷贝赋值给本身
#include<iostream>
#include<vector>
using namespace std;

void printVector(vector<int>& v) {
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}

void test01() {
    vector<int>v1;
    for (int i = 0; i < 10; i++) {
        v1.push_back(i);
    }
    printVector(v1);

    vector<int>v2;
    v2 = v1;
    printVector(v2);

    vector<int>v3;
    v3.assign(v1.begin(), v1.end());
    printVector(v3);

    vector<int>v4;
    v4.assign(10, 100);
    printVector(v4);
}

int main() {
    test01();
    system("pause");
    return 0;
}

?

4.vector容量和大小

功能描述:

  • 对vector容器的容量和大小操作

函数模型:

  • empty(); //判断容器是否为空
  • capacity(); //容器的容量
  • size(); //返回容器中元素的个数
  • resize(int num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置

    ? //如果容器变短,则末尾超出容器长度的元素被删除

  • resize(int num, elem) //重新指定容器的长度为num,若容器变长,则以elem填充新位置
#include<iostream>
#include<vector>
using namespace std;

void printVector(vector<int>& v) {
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}

void test01() {
    vector<int>v1;
    for (int i = 0; i < 10; i++) {
        v1.push_back(i);
    }
    printVector(v1);

    if (v1.empty()) {
        cout << "v1为空" << endl;
    }
    else {
        cout << "v1不为空" << endl;
        cout << "v1的容量为" << v1.capacity() << endl;
        cout << "v1的大小为" << v1.size() << endl;
    }

    //重新指定大小
    v1.resize(15);
    printVector(v1);
    v1.resize(18, 100);
    printVector(v1);
    v1.resize(8);
    printVector(v1);
}

int main() {
    test01();
    system("pause");
    return 0;
}

?

5.vector插入和删除

功能描述

  • 对vector容器进行插入、删除操作

函数原型:

  • push_back(ele); //尾部插入元素ele
  • pop_back(); //删除最后一个元素
  • insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele
  • insert(const_iterator pos, int count, ele); //迭代器指向位置pos插入count个元素ele
  • erase(const_iterator pos); //删除迭代器指向的元素
  • erase(const_iterator start, const_iterator end); //删除迭代器从start到end之间的元素
  • clear(); //删除容器中所有元素
#include<iostream>
#include<vector>
using namespace std;

void printVector(vector<int>& v) {
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}

void test01() {
    //尾插
    vector<int>v1;
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    v1.push_back(50);
    //遍历
    printVector(v1);
    //尾删
    v1.pop_back();
    printVector(v1);
    //插入
    v1.insert(v1.begin(), 100);
    printVector(v1);
    v1.insert(v1.begin(), 2, 1000);
    printVector(v1);
    //删除
    v1.erase(v1.begin());
    printVector(v1);
    v1.erase(v1.begin(), v1.end());   //v1.clear();
}

int main() {
    test01();
    system("pause");
    return 0;
}

?

6.vector数据存取

功能描述:

  • 对vector中的数据的存取操作

函数原型:

  • at(int idx); //返回索引idx所指的数据
  • operator[]; //返回索引idx所指的数据
  • front(); //返回容器中第一个数据元素
  • back(); //返回容器中最后一个数据元素
#include<iostream>
#include<vector>
using namespace std;

void test01() {
    vector<int>v1;
    for (int i = 0; i < 10; i++) {
        v1.push_back(i);
    }
    for (int i = 0; i < v1.size(); i++) {
        cout << v1[i] << " ";
    }
    cout << endl;
    for (int i = 0; i < v1.size(); i++) {
        cout << v1.at(i) << " ";
    }
    cout << endl;
    cout << "第一个元素为:" << v1.front() << endl;
    cout << "最后一个元素为:" << v1.back() << endl;
}

int main() {
    test01();
    system("pause");
    return 0;
}

总结:

  • 除了用迭代器获取vector容器中元素,[]和at也可以
  • front返回容器第一个元素
  • back返回容器最后一个元素

?

7.vector互换容器

功能描述:

  • 实现两个容器内元素进行互换

函数原型:

  • swap(vec); //将vec与本身的元素互换
#include<iostream>
#include<vector>
using namespace std;

void printVector(vector<int>& v) {
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}

//1.基本使用
void test01() {
    vector<int>v1;
    for (int i = 0; i < 10; i++) {
        v1.push_back(i);
    }
    cout << "交换前:" << endl;
    printVector(v1);

    vector<int>v2;
    for (int i = 10; i > 0; i--) {
        v2.push_back(i);
    }
    printVector(v2);

    cout << "交换后:" << endl;
    v1.swap(v2);
    printVector(v1);
    printVector(v2);
}

//2.实际用途
//巧用swap可以收缩内存空间
void test02() {
    vector<int>v;
    for (int i = 0; i < 100000; i++) {
        v.push_back(i);
    }
    cout << "v的容量:" << v.capacity() << endl;
    cout << "v的大小:" << v.size() << endl;

    v.resize(3);  //重新指定大小
    cout << "v的容量:" << v.capacity() << endl;
    cout << "v的大小:" << v.size() << endl;

    //巧用swap收缩内存
    vector<int>(v).swap(v);
    cout << "v的容量:" << v.capacity() << endl;
    cout << "v的大小:" << v.size() << endl;
}

int main() {
    test02();
    system("pause");
    return 0;
}

总结:swap可以使两个容器互换,可以达到实用的收缩内存效果

?

8.vector预留空间

功能描述:

  • 减少vector在动态扩展容量时的扩展次数

函数原型:

  • reserve(int len); //容器预留len个元素长度,预留位置不初始化,元素不可访问
#include<iostream>
#include<vector>
using namespace std;

void printVector(vector<int>& v) {
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}

//1.基本使用
void test01() {
    vector<int>v1;   

    //利用reserve预留空间
    v1.reserve(100000);

    int num = 0;
    int *p = NULL;
    for (int i = 0; i < 100000; i++) {
        v1.push_back(i);
        if (p != &v1[0]) {
            p = &v1[0];
            num++;
        }
    }
    cout << num << endl;
    cout << "v的容量:" << v1.capacity() << endl;
    cout << "v的大小:" << v1.size() << endl;

}

int main() {
    test01();
    system("pause");
    return 0;
}

原文地址:https://www.cnblogs.com/maeryouyou/p/12305460.html

时间: 2024-11-08 21:31:07

C++学习(19)—— vector容器的相关文章

STL学习二:Vector容器

1.Vector容器简介 vector是将元素置于一个动态数组中加以管理的容器. vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲). vector尾部添加或移除元素非常快速.但是在中部或头部插入元素或移除元素比较费时. 2.vector对象的默认构造 vector采用模板类实现,vector对象的默认构造形式 vector<T> vecT; vector<int> vecInt;          //一个存放int的vector容器

标准模板库(STL)学习探究之vector容器

标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据.为了可以使用vector,必须在你的头文件中包含下面的代码:#include <vector>构造函数. Vectors 包含着一系列连续存储的元素,其行为和数组类

C++学习笔记:Vector容器

vector v:初始化一个0大小的向量vector v(10):初始化一个10个大小的向量push_back:增加一个元素 pop:删除一个元素,不返回 front:返回第一个元素 back:返回最后一个元素 at:返回特定位置的元素 capacity:vector的容量,会自动扩大  也可以直接通过v[x]操作元素 /*: Test.cpp */ #include <iostream> #include <vector> #include <string> #inc

C++ STL vector容器学习

STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector,list, deque, set, map等),算法完成特定任务,迭代器用来遍历容器对象,扮演容器和算法之间的胶合剂. 模板类vector 在计算中,矢量(vector)对应数组,它的数据安排以及操作方式,与array非常类似.在C++中,使用vector模板类时,需要头文件包含#include<v

ACM学习历程—BestCoder 2015百度之星资格赛1002 列变位法解密(vector容器)

Problem Description 列变位法是古典密码算法中变位加密的一种方法,具体过程如下 将明文字符分割成个数固定的分组(如5个一组,5即为密钥),按一组一行的次序整齐排列,最后不足一组不放置任何字符,完成后按列读取即成密文. 比如: 原文:123456789 密钥:4 变换后的矩阵: 1234 5678 9xxx (最后的几个x表示无任何字符,不是空格,不是制表符,就没有任何字符,下同) 密文:159263748 再比如: 原文:Hello, welcome to my dream w

谈谈vector容器的三种遍历方法

说明:本文仅供学习交流,转载请标明出处,欢迎转载! vector容器是最简单的顺序容器,其使用方法类似于数组,实际上vector的底层实现就是采用动态数组.在编写程序的过程中,常常会变量容器中的元素,那么如何遍历这些元素呢?本文给出三种遍历方法. 方法一:采用下标遍历 由于vector容器就是对一个动态数组的包装,所以在vector容器的内部,重载了[]运算符,函数原型为:reference operator [] (size_type n);所以我们可以采用类似于数组的方式来访问vector容

UVA 1412 - Fund Management(用vector容器模拟状态的状压dp)

Frank is a portfolio manager of a closed-end fund for Advanced Commercial Markets (ACM ). Fund collects money (cash) from individual investors for a certain period of time and invests cash into various securities in accordance with fund's investment

把《c++ primer》读薄(3-2 标准库vector容器+迭代器初探)

督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 标准库vector类型初探,同一种类型的对象的集合(类似数组),是一个类模版而不是数据类型,学名容器,负责管理 和 存储的元素 相关的内存,因为vetcor是类模版,对应多个不同类型,比如int,string,或者自己定义的数据类型等. 程序开头应如下声明 #include <iostream> #include <vector> #include <string> using std::strin

C++学习笔记5 容器

1.  使用assign assign 操作首先删除容器中所有的元素,然后将其参数所指定的新元素插入到该容器中.与复制容器元素的构造函数一样,如果两个容器类型相同,其元 素类型也相同,就可以使用赋值操作符(=)将一个容器赋值给另一个容器.如果在不同(或相同)类型的容器内,元素类型不相同但是相互兼容,则其赋值运 算必须使用assign 函数.例如,可通过assign 操作实现将vector 容器中一段char* 类型的元素赋给string 类型list 容器. 由于assign 操作首先删除容器中