STL学习二:Vector容器

1.Vector容器简介

  • vector是将元素置于一个动态数组中加以管理的容器。
  • vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲)。
  • vector尾部添加或移除元素非常快速。但是在中部或头部插入元素或移除元素比较费时。

2.vector对象的默认构造

vector采用模板类实现,vector对象的默认构造形式

vector<T> vecT;

vector<int> vecInt;          //一个存放int的vector容器。

vector<float> vecFloat;     //一个存放float的vector容器。

3.vector对象的带参数构造

  • vector(beg,end);    //构造函数将[beg, end)区间中的元素拷贝给本身。注意该区间是左闭右开的区间。
  • vector(n,elem);   //构造函数将n个elem拷贝给本身。
  • vector(const vector &vec);  //拷贝构造函数

 1 #include <iostream>
 2 using namespace std;
 3 #include <vector>
 4
 5 void objPlay()
 6 {
 7     int  iArray[] = { 0, 1, 2, 3, 4 };
 8     vector<int> vecIntA(iArray, iArray + 5);
 9     vector<int> vecIntB(vecIntA.begin(), vecIntA.end());   //用构造函数初始化容器vecIntB
10     vector<int> vecIntB(vecIntA.begin(), vecIntA.begin() + 3);
11     vector<int> vecIntC(3, 9); //此代码运行后,容器vecIntB就存放3个元素,每个元素的值是9。
12     vector<int> vecIntD(vecIntA);
13 }
14 int main()
15 {
16     objPlay();
17     system("pause");
18 }

4.vector的赋值

  • vector.assign(beg,end);    //将[beg, end)区间中的数据拷贝赋值给本身。注意该区间是左闭右开的区间。
  • vector.assign(n,elem);  //将n个elem拷贝赋值给本身。
  • vector& operator=(const vector  &vec);          //重载等号操作符
  • vector.swap(vec);  // 将vec与本身的元素互换。

void objPlay2()
{
    vector<int> vecIntA, vecIntB, vecIntC, vecIntD;
    int  iArray[] = { 0, 1, 2, 3, 4 };
    vecIntA.assign(iArray, iArray + 5);
    vecIntB.assign(vecIntA.begin(), vecIntA.end());    //用其它容器的迭代器作参数。
    vecIntC.assign(3, 9);
    vecIntD = vecIntA;
    vecIntA.swap(vecIntD);
}

5.vector的大小

  • vector.size();         //返回容器中元素的个数
  • vector.empty();     //判断容器是否为空
  • vector.resize(num);   //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
  • vector.resize(num, elem);  //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。

void objPlay3()
{
    vector<int> vecInt;
    int  iArray[] = {  1, 2, 3 };
    int iSize = vecInt.size();        //iSize == 3;
    bool bEmpty = vecInt.empty();    // bEmpty == false;
    vecInt.resize(5);  //此时里面包含1,2,3,0,0元素。
    vecInt.resize(8, 3);  //此时里面包含1,2,3,0,0,3,3,3元素。
    vecInt.resize(2);  //此时里面包含1,2元素。
}

6.vector末尾的添加移除操作

  • vector.push_back();//向容器的尾部插入元素
  • vector.pop_back();//从容器的尾部弹出元素

void objPlay4()
{
    vector<int> vecInt;
    vecInt.push_back(1);  //在容器尾部加入一个元素
    vecInt.push_back(3);
    vecInt.push_back(5);
    vecInt.push_back(7);
    vecInt.push_back(9);//此时容器有5个元素,1,3,5,7,9
    vecInt.pop_back();  //弹出尾部的一个元素
    vecInt.pop_back();  //此时容器只有3个元素,1,3,5
}

7.vector的数据随机存取

  • vec.at(idx);    //返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。
  • vec[idx];          //返回索引idx所指的数据,越界时,运行直接报错

void objPlay5()
{
    int  iArray[] = { 1, 3, 5,7,9 };
    vector<int> vecInt(iArray,iArray+5); //包含1 ,3 ,5 ,7 ,9
    vecInt.at(2) == vecInt[2];            //5
    vecInt.at(2) = 8;                  // 或  vecInt[2] = 8;

    int iF = vecInt.front();         //iF==1
    int iB = vecInt.back();            //iB==9
    vecInt.front() = 11;           //vecInt包含{11,3,8,7,9}
    vecInt.back() = 19;              //vecInt包含{11,3,8,7,19}
}

8.vector的插入

  • vector.insert(pos,elem);   //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
  • vector.insert(pos,n,elem);   //在pos位置插入n个elem数据,无返回值。
  • vector.insert(pos,beg,end);   //在pos位置插入[beg,end)区间的数据,无返回值

void objPlay6()
{
    vector<int> vecA;
    vector<int> vecB;

    vecA.push_back(1);
    vecA.push_back(3);
    vecA.push_back(5);
    vecA.push_back(7);
    vecA.push_back(9);

    vecB.push_back(2);
    vecB.push_back(4);
    vecB.push_back(6);
    vecB.push_back(8);

    vecA.insert(vecA.begin(), 11);        //{11, 1, 3, 5, 7, 9}
    vecA.insert(vecA.begin() + 1, 2, 33);        //{11,33,33,1,3,5,7,9}
    vecA.insert(vecA.begin(), vecB.begin(), vecB.end());    //{2,4,6,8,11,33,33,1,3,5,7,9}
}

9.vector的删除

  • vector.clear();      //移除容器的所有数据
  • vec.erase(beg,end);  //删除[beg,end)区间的数据,返回下一个数据的位置。
  • vec.erase(pos);    //删除pos位置的数据,返回下一个数据的位置。

void objPlay7()
{
    vector<int> vecInt;
    vecInt.push_back(1);
    vecInt.push_back(3);
    vecInt.push_back(5);
    vecInt.push_back(7);
    vecInt.push_back(9);//此时容器元素是1,3,5,7,9
    vector<int>::iterator itBegin = vecInt.begin() + 1;
    vector<int>::iterator itEnd = vecInt.begin() + 2;
    vecInt.erase(itBegin, itEnd); //删除后 1,5,7,9(左闭右开)
    for (vector<int>::iterator it = vecInt.begin(); it != vecInt.end();)    //小括号里不需写  ++it
    {
        if (*it == 3)
        {
            it = vecInt.erase(it);      //以迭代器为参数,删除元素3,并把数据删除后的下一个元素位置返回给迭代器  ,此处不能it++,因为删除后迭代器自动后移
        }
        else
        {
            ++it;
        }
    }
    //删除vecInt的所有元素
    vecInt.clear();            //容器为空
}

10.迭代器基本原理

  • 迭代器是一个可遍历STL容器内全部或部分元素的对象。
  • 迭代器指出容器中的一个特定位置。
  • 迭代器就如同一个指针。
  • 迭代器提供对一个容器中的对象的访问方法,并且可以定义了容器中对象的范围。

迭代器的分类

  输入迭代器:也有叫法称之为“只读迭代器”,它从容器中读取元素,只能一次读入一个元素向前移动,只支持一遍算法,同一个输入迭代器不能两遍遍历一个序列。

  输出迭代器:也有叫法称之为“只写迭代器”,它往容器中写入元素,只能一次写入一个元素向前移动,只支持一遍算法,同一个输出迭代器不能两遍遍历一个序列。

  正向迭代器:组合输入迭代器和输出迭代器的功能,还可以多次解析一个迭代器指定的位置,可以对一个值进行多次读/写。

  双向迭代器:组合正向迭代器的功能,还可以通过--操作符向后移动位置。

11.双向迭代器与随机访问迭代器

双向迭代器支持的操作:it++,  ++it,    it--,   --it,*it, itA = itB

随机访问迭代器支持的操作:it+=i, it-=i, it+i(或it=it+i),it[i]

void objPlay8()
{
    vector<int> vecInt;
    vecInt.push_back(1);
    vecInt.push_back(3);
    vecInt.push_back(5);
    vecInt.push_back(7);
    vecInt.push_back(9);//此时容器元素是1,3,5,7,9
    for (vector<int>::iterator it = vecInt.begin(); it != vecInt.end(); ++it)
    {
        int iItem = *it;
        cout << iItem;    //或直接使用  cout << *it;
    }
    //打印出1 3 5 7 9
    for (vector<int>::reverse_iterator rit = vecInt.rbegin(); rit != vecInt.rend(); ++rit)    //注意,小括号内仍是++rit
    {
        int iItem = *rit;
        cout << iItem;    //或直接使用cout << *rit;
    }
  //打印出9, 7, 5, 3, 1
}
时间: 2024-10-10 14:43:30

STL学习二:Vector容器的相关文章

C++STL库中vector容器常用应用

#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { vector<int> vec; vec.push_back(1);//在尾部插入元素 vec.push_back(2); // cout<<vec[1];//按下标访问元素,从[0]开始 /* //使用迭代器访问元素 vector<int>::iterat

STL《1》STL简介及vector容器的使用

 C++STL(Standard Template Library 标准模板库)是通用类模板和算法的集合,它提供给程序员一些标准的的数据结构的实现,如:queues(队列).lists(链表).stacks(栈)等 STL由六大组件组成 容器(Container) 算法(Algorithm) 迭代器(Iterator) 仿函数(Function object) 适配器(Adaptor) 空间配制器(allocator) C++ Vector(向量容器) Vector是一个线性顺序结构.相当于

STL学习笔记— —特殊容器priority_queue

简介 在头文件<queue> 中定义 namespace std { template <typename T, typename Container = vector<T>, typename Compare = less<typename Container::value_type>> class priority_queue; } priority_queue与queue很类似,但是priority_queue内部根据某种规则进行了排序,所以既不是先进

STL学习之vector

vector是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩展.它可以像指针一样被操作,由于它的特性我们完全可以将vector看做动态数组. 特点: 1.指定一块如同数组一样的连续存储,但空间可以动态扩展.即它可以像数组一样操作,并且可以动态操作. 2.随机访问方便,它像数组一样被访问. 3.节省空间,因为它是连续存储,在存储的区域是没有被浪费的,当然未存储的区域实际是浪费的. 4.在内部插入删除效率非常低,这样的操作基本是被禁止的.vector被设计成只能在后端进行追加和删除

STL学习笔记— —无序容器(Unordered Container)

简单介绍 在头文件<unordered_set>和<unordered_map> 中定义 namespace std { template <typename T, typename Hash = hash<T>, typename EqPred = equal_to<T>, typename Allocator = allocator<T> > class unordered_set; template <typename T

STL学习(multiset Vector)

Vector比数组好用多了,毕竟是可变长的. 常用来建图. 需要掌握的就是构造函数,添加数据,删除数据. #include<set> #include<ctime> #include<cmath> #include<cstdio> #include<vector> #include<cstring> #include<iostream> #include<algorithm> #define maxn 1100

STL学习笔记— —特殊容器queue

简介 在头文件<queue> 中定义 namespace std { template <typename T, typename Container = deque<T>> class queue; } queue就是数据结构里队列的实现,先进先出.定义中的第二个参数用来定义queue内部存放元素的实际容器,可以是任何序列式容器,默认容器为deque. 实际上queue也只是很单纯地把各项操作转化为内部容器的对应调用. 核心接口 push() //将一个元素置入que

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

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

C++ STL vector容器学习

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