【C++】——vector容器

前言

对于vector,其实和string类是有点像的,但是里面的结构又有点不一样,所以有些操作是需要注意的

一 vector基本概念

1.我们使用vector的时候,可以把他当作一个数组来使用,只不过这个数组是可以自动扩容的

2.vector里面的数据是存在堆上面的,数组里面的数据是存在栈里面的,这个要区分

 3.使用vector的时候需要包含#include<vector>头文件

 

二 vector的构造函数

函数原型:

default (1)
explicit vector (const allocator_type& alloc = allocator_type());
fill (2)
explicit vector (size_type n, const value_type& val = value_type(),
                 const allocator_type& alloc = allocator_type());
range (3)
template <class InputIterator>
         vector (InputIterator first, InputIterator last,
                 const allocator_type& alloc = allocator_type());
copy (4)
vector (const vector& x);

1.vector (const allocator_type& alloc = allocator_type());//无参构造函数

2.vector (size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type());//将n个val拷贝给本身

3.vector (InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type());//使用迭代器把区间内的元素给本身

4.vector (const vector& x);//拷贝构造函数

1.explicit是限制隐式类型转换的。

2.对于第三个迭代器来说,设置为模板,这样就可以使用其他类型,而不单单限制于一种类型

3.对于const allocator_type& alloc = allocator_type()这个来说,他只是一个内存池,如果我们不写就用这个默认的,除非你觉得你比他的写得好,你就可以传进去😘😘

 为了方便测试,我们遍历容器的时候使用范围for来遍历,原理其实就是迭代器

#define _CRT_SECURE_NO_WARNINGS 1
// constructing vectors
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    // constructors use order as described above:
    vector<int> first;                      //构造一个空的vector
    vector<int> second(4, 100);                       //构造一个4个大小,val是100的vector
    vector<int> third(second.begin(), second.end());  //用迭代器去初始化third这个容器
    vector<int> fourth(third);                       //用使用拷贝构造初始化fourth
    cout << "second的内容是:";
    for (auto e : second)
    {
        cout << e <<' ';
    }
    cout << endl;
    cout << "third的内容是:";
    for (auto e : third)
    {
        cout << e << ' ';
    }
    cout << endl;
    cout << "fourth的内容是:";
    for (auto e : fourth)
    {
        cout << e << ' ';
    }
    cout << endl;
    // 迭代器构造也可以使用数组去构造:
    int myints[] = { 16,2,77,29 };
    vector<int> fifth(myints, myints + sizeof(myints) / sizeof(int));
    cout << "这个fifth的内容是";
    for (vector<int>::iterator it = fifth.begin(); it != fifth.end(); ++it)
        cout << ' ' << *it;
    cout << endl;

    return 0;
}

 

特别是最后一个要注意,是可以用数组去初始化的,但是用的比较少

 

三.vector的赋值操作

1.vector& operator= (const vector& x);//重载赋值运算符

2.assign(v.begin(),v.end()); //将[v.begin(),v.end())区间中的元素赋值给本身
3.assign(n,elem); //将n个elem赋值给本身

 对于上面的三种,我们一般使用的是第一种,其余的用迭代器是一样的

下面我们就先来测试一下

// constructing vectors
// vector assignment
#include <iostream>
#include <vector>
using namespace std;
int main()
{
	vector<int> foo(3, 0);
	vector<int> bar(5, 0);

	bar = foo;
	foo = std::vector<int>();

	cout << "Size of foo: " << int(foo.size()) << endl; 
	cout << "Size of bar: " << int(bar.size()) << endl;
	return 0;
}

 

四 vector的容量与大小 

 函数原型

1.size_type size() const;
2.size_type size() const;
3.void resize (size_type n, value_type val = value_type());
4.size_type capacity() const;
5.bool empty() const;
6.void reserve (size_type n);
7.void shrink_to_fit();

size            Return size (public member function )//有效数据大小

max_size    Return maximum size (public member function )//系统能够给出的最大有效数据容量

resize         Change size (public member function )//重新指定容器的长度为num,若容器变长,则以val值填充新位置,如果容器变短,则末尾超过容器长度的元素被删除

capacity       Return size of allocated storage capacity (public member function )//容器的容量

empty          Test whether vector is empty (public member function )//如果容器为空,返回true,否则返回false

reserve         Request a change in capacity (public member function )//预分配空间,改变容量,不改变size

shrink_to_fit  Shrink to fit (public member function ) //请求容器减少其容量以匹配其当前大小

为了方便测试,先来测试shrink_to_fit

#define _CRT_SECURE_NO_WARNINGS 1
// vector::shrink_to_fit
#include <iostream>
#include <vector>
using namespace std;
int main()
{

	vector<int> myvector(100);
	cout << "1. capacity of myvector: " << myvector.capacity() << endl;
	myvector.resize(10);
	cout << "2. capacity of myvector: " << myvector.capacity() << endl;
	myvector.shrink_to_fit();
	cout << "3. capacity of myvector: " << myvector.capacity() << endl;
	return 0;
}

可以看出在最后调用以后,把没用的空间给释放了

有了上面的测试,那下面就来其他函数的测试


#include <iostream>
#include <vector>
using namespace std;
int main()
{
	vector<int> myints;
	for (int i = 0; i < 10; i++) myints.push_back(i);
	cout << " size: " << myints.size() << endl;
	cout << "capacity:" << myints.capacity() << endl;
	cout << "max_size:" << myints.max_size() << endl;
	myints.resize(15);
	cout << "resize之后的size:" << myints.size() << endl;
	cout << "resize之后的capacity:" << myints.capacity() << endl;
	myints.reserve(100);
	cout << "reserve之后的size:" << myints.size() << endl;
	cout << "reserve之后的capacity" << myints.capacity() << endl;

	return 0;
}

从运行结果就可以看出他们的用法和区别了

五 vector的元素修改

1.void push_back (const value_type& val);
2.void pop_back();
3.void insert (iterator position, size_type n, const value_type& val);
  iterator insert (iterator position, const value_type& val);
 void insert (iterator position, InputIterator first, InputIterator last);
4.iterator erase (iterator position);
iterator erase (iterator first, iterator last);
5.void swap (vector& x);
6.void clear();

对于insert和erase来说,他们可以采用迭代器进行插入删除 ,所以有多种表现形式

Modifiers:

push_back    Add element at the end (public member function )//尾插一个元素

pop_back      Delete last element (public member function )//尾删一个元素

insert            Insert elements (public member function )//插入一个元素

erase              Erase elements (public member function )//删除一个元素

swap               Swap content (public member function )//交换元素

clear               Clear content (public member function )//清理有效数据,不改变容量

 测试案例


#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> myvector;
    for (int i = 0; i < 10; i++)
    {
        myvector.push_back(i);//尾插一个元素
    }
    cout << "尾插后的数据大小:";
    cout << myvector.size() << endl;
    myvector.pop_back();
    cout << "尾删后的数据大小:";
    cout << myvector.size() << endl;
    cout << "插入一个元素:";
    myvector.insert(myvector.begin(), 1);//这里的位置需要用迭代器
    cout << myvector.size() << endl;
    cout << "删除一个元素:";
    myvector.erase(myvector.begin());//删除也需要用迭代器
    cout << myvector.size() << endl;
    cout << "清除元素:";
    myvector.clear();
    cout << myvector.size() << endl;
    return 0;
}

还有一个交换

 

// swap vectors
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> foo(3, 100);   // 三个值为100
    vector<int> bar(5, 200);   // 五个值为200

    foo.swap(bar);

    cout << "foo contains:";
    for (unsigned i = 0; i < foo.size(); i++)
        std::cout << ' ' << foo[i];
    cout << endl;

    cout << "bar contains:";
    for (unsigned i = 0; i < bar.size(); i++)
        std::cout << ' ' << bar[i];
    cout <<endl;

    return 0;
}

 

 

六 vector数据的存取

1.reference operator[] (size_type n); 
2.reference at (size_type n); 
3.reference front();
4.reference back(); 

以上四个都是由const形式的,就是用于给const类型的函数或者对象使用

operator[]    Access element (public member function )//返回[]索引所指向的数据

at                Access element (public member function )//返回n索引所指向的数据

front            Access first element (public member function )//返回第一个元素

back           Access first element (public member function )//返回最后一个元素

测试案例:

1.对于operator[]

// vector::operator[]
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> myvector(10);   // 10 zero-initialized elements

    vector<int>::size_type sz = myvector.size();

    // assign some values:
    for (unsigned i = 0; i < sz; i++) myvector[i] = i;

    // 使用[]对里面的元素实现逆置
    for (unsigned i = 0; i < sz / 2; i++)
    {
        int temp;
        temp = myvector[sz - 1 - i];
        myvector[sz - 1 - i] = myvector[i];
        myvector[i] = temp;
    }

    cout << "myvector contains:";
    for (unsigned i = 0; i < sz; i++)
        cout << ' ' << myvector[i];
    cout << '\n';

    return 0;
}

 

2.对于at

// vector::operator[]
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> myvector(10);   // 10 zero-initialized elements

    vector<int>::size_type sz = myvector.size();

    // assign some values:
    for (unsigned i = 0; i < sz; i++) myvector.at(i) = i;

    cout << "myvector contains:";
    for (unsigned i = 0; i < sz; i++)
        cout << ' ' << myvector.at(i);
    cout << '\n';

    return 0;
}

 

3.对于 front于back


#include <iostream>
#include <vector>
using namespace std;
int main()
{
	vector<int> myvector;

	myvector.push_back(78);
	myvector.push_back(16);

	//取第一元素减去最后的元素
	myvector.front() -= myvector.back();

	cout << "myvector.front() is now " << myvector.front() << endl;

	return 0;
}

 

 总结

在C++中vector用的很多,我之前都是看别人用,自己不会用,但是看多了也会了,现在把原理都搞清楚了一遍,用的时候也就可以更加得心应手了,喜欢的话,点赞加收藏!