vector类的使用

目录

​一、vector类的组织形式

二、vector类的成员函数

1.默认成员函数

(1)构造函数、拷贝构造函数

(2)析构函数和赋值运算符重载

2.容量操作

3.迭代器(iterator)

4.元素访问

5.修改操作


一、vector类的组织形式

vector是可变大小的序列容器,底层组织为顺序表,大小可变,数据类型自由,也可以采用下标对vector的元素进行访问。

这是cplusplus网站上vector的介绍:

下面我将介绍vector的常用接口

二、vector类的成员函数

1.默认成员函数

在成员函数的第一部分就是string的三个默认成员函数,从上到下为构造函数、拷贝构造函数、析构函数和赋值运算符重载

(1)构造函数、拷贝构造函数

vector的构造与拷贝构造函数常用的有以下四个:

vector();——————不传参的默认构造,构造空vector对象,相当于空的顺序表

vector(size_type n, const value_type& val = value_type());——————构造一个vector并插入n个value_type类型的默认构造变量。

vector (const vector& x);——————拷贝构造一个vector变量

vector (InputIterator first, InputIterator last);——————用另一个自定义类型变量(这里的变量的类型不一定是vector)的迭代器的两个位置为头尾,初始化这个vector变量

测试代码:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    vector<int> v1;
    for (auto e : v1)
    {
        cout << e;
    }
    cout << endl;
    
    vector<int> v2(10, 1);
    for (auto e : v2)
    {
        cout << e;
    }
    cout << endl;
    
    vector<int> v3(v2);
    for (auto e : v3)
    {
        cout << e;
    }
    cout << endl;
    
    vector<int> v4(v2.begin(), v2.end());
    for (auto e : v4)
    {
        cout << e;
    }
    cout << endl;
    
    string s = "hello world";
    vector<char> v5(s.begin(), s.end());
    for (auto e : v5)
    {
        cout << e;
    }
    cout << endl;
    return 0;
}

测试结果:

(2)析构函数和赋值运算符重载

析构函数不可重载的特性只有一个:~vector(),一样直接释放空间,指针置空即可。

vector& operator= (const vector& x);——————将x的内容赋值给左侧变量,没什么好讲的。

2.容量操作

容量操作包含以下内容:

size_t size() const;——————返回vector有效数据的数目

size_t max_size() const;——————返回vector可储存数据的数量上限,此接口在使用中没有意义

void resize (size_t n, value_type val = value_type());——————改变空间大小,若新空间大于旧空间插入对应字符,小于则直接截断

size_t capacity() const;——————返回已开辟空间足够储存多少个元素

bool empty() const;——————检测当前vector是否为空

void reserve (size_t n);——————如果n值大于当前的空间大小,便扩大空间到n个字符,小于则不做改变。

void shrink_to_fit();——————将vector的容量缩小到有效数据的大小

测试代码:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    vector<int> v1(5, 1);
    cout << v1.size() << endl;
    cout << v1.capacity() << endl;
    for (auto e : v1)
    {
        cout << e;
    }
    cout << endl;
    v1.resize(10, 3);
    for (auto e : v1)
    {
        cout << e;
    }
    cout << endl;
    cout << v1.empty() << endl;
    v1.reserve(20);
    cout << v1.size() << endl;
    cout << v1.capacity() << endl;
    return 0;
}

 测试结果:

3.迭代器(iterator)

vector同样有两个迭代器:正向和反向迭代器

vector的正向迭代器

iterator begin();——————vector的头,可读可写

const_iterator begin() const;——————vector的头,只读

iterator end();——————vector的尾,可读可写

const_iterator end() const;——————vector的尾,只读

vector的反向迭代器

reverse_iterator rbegin();——————vector的逆向的头,可读可写

const_reverse_iterator rbegin() const;——————vector的逆向的头,只读

reverse_iterator rend();——————vector的逆向后的尾,可读可写

const_reverse_iterator rend() const;——————vector的逆向的尾,只读

测试代码:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    vector<int> v1;
    v1.push_back(1);
    v1.push_back(2);
    v1.push_back(3);
    v1.push_back(4);
    vector<int>::iterator it1 = v1.begin();
    while (it1 != v1.end())
    {
        printf("%d", *it1);
        it1++;
    }
    cout << endl;
    vector<int>::reverse_iterator it2 = v1.rbegin();
    while (it2 != v1.rend())
    {
        printf("%d", *it2);
        it2++;
    }
    cout << endl;
    vector<int>::iterator it3 = v1.begin();
    while (it3 != v1.end())
    {
        *it3 = 1;
        it3++;
    }
    it3 = v1.begin();
    while (it3 != v1.end())
    {
        cout << *it3;
        it3++;
    }
    cout << endl;
    return 0;
}

测试结果:

4.元素访问

operator[]——————直接重载[]使s[i]就可以直接访问对应下标元素,而且也加上了越界的检查,提高了程序的安全性。

reference operator[] (size_t n);——————可读可写

const_reference operator[] (size_t n) const;——————只读

at函数——————与[]作用相同

reference at (size_t n);——————可读可写

const_reference at (size_t n) const;——————只读

测试代码:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    vector<int> v1;
    v1.push_back(1);
    v1.push_back(2);
    v1.push_back(3);
    v1.push_back(4);
    vector<int>::iterator it1 = v1.begin();
    for (auto e : v1)
    {
        cout << e;
    }
    cout << endl;
    cout << v1[1] << endl;
    cout << v1.at(1) << endl;
    v1[1] = 6;
    it1 = v1.begin();
    for (auto e : v1)
    {
        cout << e;
    }
    cout << endl;
    return 0;
}

测试结果:

5.修改操作

assign——————将原本的内容删除然后放入相应数据

template

void assign (InputIterator first, InputIterator last);——————将对象通过另一个对象的迭代器赋值

void assign (size_t n, const value_type& val);——————赋值对象为含有n个val对象的vector

void push_back(char c);——————尾插变量

void push_back(char c);——————尾插变量

insert——————在特定位置插入内容

iterator insert (iterator position, const value_type& val);——————在position的迭代器位置插入val变量

void insert (iterator position, size_t n, const value_t& val);——————在position的迭代器位置开始插入n个val变量

template

void insert (iterator position, InputIterator first, InputIterator last);——————在position的迭代器位置插入迭代器从first位置到last位置的内容

erase——————清除内容

iterator erase (iterator position);——————清除position的迭代器位置的内容

iterator erase (iterator first, iterator last);——————清除从first到last的迭代器位置的所有内容

void clear();——————清除string的内容为空字符串,但不释放空间

测试代码:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    //template <class InputIterator>
    //void assign(InputIterator first, InputIterator last);
    //    void assign(size_t n, const value_type& val);
    vector<int> v1;
    v1.push_back(1);
    v1.push_back(2);
    v1.push_back(3);
    v1.push_back(4);
    vector<int>::iterator it1 = v1.begin();
    for (auto e : v1)
    {
        cout << e;
    }
    cout << endl;
    
    vector<int> v2;
    v2.assign(v1.begin() + 1, v1.end() - 1);
    for (auto e : v2)
    {
        cout << e;
    }
    cout << endl;

    vector<int> v3;
    v3.assign(4, 1);
    for (auto e : v3)
    {
        cout << e;
    }
    cout << endl;
    
    //iterator insert(iterator position, const value_type& val);
    //void insert(iterator position, size_t n, const value_t& val);
    //template <class InputIterator>
    //    void insert(iterator position, InputIterator first, InputIterator last);
    v1.insert(v1.begin(), 1);
    it1 = v1.begin();
    for (auto e : v1)
    {
        cout << e;
    }
    cout << endl;

    v1.insert(v1.end(), 4, 7);
    it1 = v1.begin();
    for (auto e : v1)
    {
        cout << e;
    }
    cout << endl;

    v1.insert(v1.begin(), v2.begin(),v2.end());
    it1 = v1.begin();
    for (auto e : v1)
    {
        cout << e;
    }
    cout << endl;

    //iterator erase(iterator position);
    //iterator erase(iterator first, iterator last);
    v1.erase(v1.begin());
    it1 = v1.begin();
    for (auto e : v1)
    {
        cout << e;
    }
    cout << endl;

    v1.erase(v1.begin(), v1.end());
    it1 = v1.begin();
    for (auto e : v1)
    {
        cout << e;
    }
    cout << endl;
    return 0;
}

测试结果:

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值