C++ vector的基本使用(待补全)

 

std::vector 是C++标准模板库(STL)中的一个非常重要的容器类,它提供了一种动态数组的功能。能够存储相同类型的元素序列,并且可以自动管理存储空间的大小,以适应序列大小变化,处理元素集合的时候很灵活

 1. vector的定义

构造函数声明接口说明
vector();无参构造
vector( size_t n, const value_type& val = value_type());构造并初始化n个val
vector(const vector& x);拷贝构造
vector(InputIterator first, InputIterator last);使用迭代器进行初始化构造

 代码如下

#include<iostream>
#include<vector>
//using namespace std;
using std::vector;
using namespace std;
int main()
{
	vector<int> v1;
	for (size_t i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << "  ";
	}
	cout << endl;
	vector<int> v2(10);
	vector<int> v3(10, 6);
	for (size_t i = 0; i < v2.size(); i++)
	{
		cout << v2[i] << "," << v3[i] << "    ";
	}
	cout << endl;
	vector<int> v4(v2);
	for (size_t i = 0; i < v4.size(); i++)
	{
		cout << v4[i] << "  ";
	}
	cout << endl;

	vector<int> v5(v3.begin(), v3.begin() + 2);
	for (size_t i = 0; i < v5.size(); i++)
	{
		cout << v5[i] << "  ";
	}
	cout << endl;
}

其中v1是无参默认构造, v2是利用了缺省值全初始化为0,v3是初始化n个 6,v4是用v2进行拷贝构造,v5则是利用迭代器进行构造

输出结果如下

 2. 迭代器iterator的使用

iterator的使用接口说明
begin+end获取第一个位置数据的iterator/const_iterator,获取最后一个数据的下一个位置的iterator/const_iterator
rbegin+rend获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的reverse_iterator 

如下图所示

 使用代码如下

#include<iostream>
#include<vector>
//using namespace std;
using namespace std;
int main()
{
	vector<int> v(10,6);
	v.push_back(1);
	//vector<int>::iterator it = v.begin();
	auto it = v.begin();
	while (it != v.end())
	{
		cout << *it << "  ";
		it++;
	}
	cout << endl;
	vector<int>::reverse_iterator iv = v.rbegin();
	while (iv != v.rend())
	{
		cout << *iv << "  ";
		iv++;
	}
	cout << endl;
}

输出结果如下

 使用iterator不可以vector::iterator it = v.begin();  因为vector是一个模板类需要指定其存储元素的类型。直接写没指定vector具体类型,编译器不知道就会报错(比如可能是vector<double>,vector<int>等)。当然也可以直接用auto自动识别。

3. vector空间增长问题

成员函数接口说明
size获取数据个数
capacity获取容量大小
empty判断是否为空
resize改变vector的元素个数(size)
reserve改变vector的容量(capacity)
(1). size与capacity

用以下代码验证vector动态增长

#include<iostream>
#include<vector>
//using namespace std;
using namespace std;
int main()
{
	vector<int> v;
	size_t sz = v.capacity();
	cout << "容量为:" << sz << endl;
	cout << "元素个数:" << v.size() << endl;
	for (int i = 0; i < 100; i++)
	{
		v.push_back(i);
		if (sz != v.capacity())
		{
			sz = v.capacity();
			cout << "当前容量:" << sz << endl;
			cout << "当前元素个数:" << v.size() << endl;
		}
	}
}

输出结果为下图

 通过上图我们不难发现,在vs中运行每次增长1.5倍,向上取整

而g++下运行每次增长2倍,并不是所有的vector增容都是增长1.5倍或2倍的。具体增长是多少是看具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。

(2). empty与resize与reserve

reserve只负责开辟空间,如果确定要用多少空间,reserve可以缓解vector增容的代价缺陷问题。只影响capacity(),不影响size()

resize在开空间时还会进行初始化,会影响capacity()还会影响size()

 如以下代码

#include<iostream>
#include<vector>
//using namespace std;
using namespace std;
int main()
{
	vector<int> v1;
	size_t sz = v1.capacity();
	cout << "v1容量为:" << sz << endl;
	cout << "v1元素个数:" << v1.size() << endl;
	if(v1.empty())
	{
		v1.reserve(100);
	}
	for (int i = 0; i < 100; i++)
	{
		v1.push_back(i);
		if (sz != v1.capacity())
		{
			sz = v1.capacity();
			cout << "v1当前容量:" << sz << endl;
			cout << "v1当前元素个数:" << v1.size() << endl;
		}
	}
	vector<int> v2;
	cout << "v2容量为:" << v2.capacity() << endl;
	cout << "v2元素个数:" << v2.size() << endl;
	v2.resize(10);
	cout << "v2当前容量为:" << v2.capacity() << endl;
	cout << "v2当前元素个数为:" << v2.size() << endl;
	for (int i = 0; i < v2.size(); i++)
	{
		cout << v2[i] << "  ";
	}
	cout << endl;
	vector<int> v3;
	cout << "v3容量为:" << v3.capacity() << endl;
	cout << "v3元素个数:" << v3.size() << endl;
	v3.resize(10, 3);
	cout << "v3当前容量为:" << v3.capacity() << endl;
	cout << "v3当前元素个数为:" << v3.size() << endl;
	for (int i = 0; i < v3.size(); i++)
	{
		cout << v3[i] << "  ";
	}
	cout << endl;
}

输出结果为下图所示

 可以验证我们以上说法

4. vector的增删查改

vector的元素操作接口说明
push_back尾插
pop_back尾删
find查找(算法模块实现,不是vector成员接口)
insert在position(指定坐标)之前插入val
erase删除position(指定坐标)位置的数据
swap交换两个vector的数据空间
operator[]重载运算符,使其能像数组一样访问

//#include<iostream>
//#include<vector>
using namespace std;
//using std::vector;
//using namespace std;
//int main()
//{
//    vector<int> v1;
//    for (size_t i = 0; i < v1.size(); i++)
//    {
//        cout << v1[i] << "  ";
//    }
//    cout << endl;
//    vector<int> v2(10);
//    vector<int> v3(10, 6);
//    for (size_t i = 0; i < v2.size(); i++)
//    {
//        cout << v2[i] << "," << v3[i] << "    ";
//    }
//    cout << endl;
//    vector<int> v4(v2);
//    for (size_t i = 0; i < v4.size(); i++)
//    {
//        cout << v4[i] << "  ";
//    }
//    cout << endl;
//
//    vector<int> v5(v3.begin(), v3.begin() + 2);
//    for (size_t i = 0; i < v5.size(); i++)
//    {
//        cout << v5[i] << "  ";
//    }
//    cout << endl;
//}

//#include<iostream>
//#include<vector>
using namespace std;
//using namespace std;
//int main()
//{
//    vector<int> v(10,6);
//    v.push_back(1);
//    //vector<int>::iterator it = v.begin();
//    auto it = v.begin();
//    while (it != v.end())
//    {
//        cout << *it << "  ";
//        it++;
//    }
//    cout << endl;
//    vector<int>::reverse_iterator iv = v.rbegin();
//    while (iv != v.rend())
//    {
//        cout << *iv << "  ";
//        iv++;
//    }
//    cout << endl;
//}

//#include<iostream>
//#include<vector>
using namespace std;
//using namespace std;
//int main()
//{
//    vector<int> v;
//    size_t sz = v.capacity();
//    cout << "容量为:" << sz << endl;
//    cout << "元素个数:" << v.size() << endl;
//    for (int i = 0; i < 100; i++)
//    {
//        v.push_back(i);
//        if (sz != v.capacity())
//        {
//            sz = v.capacity();
//            cout << "当前容量:" << sz << endl;
//            cout << "当前元素个数:" << v.size() << endl;
//        }
//    }
//}


#include<iostream>
#include<vector>
//using namespace std;
using namespace std;
int main()
{
    vector<int> v1;
    size_t sz = v1.capacity();
    cout << "v1容量为:" << sz << endl;
    cout << "v1元素个数:" << v1.size() << endl;
    if(v1.empty())
    {
        v1.reserve(100);
    }
    for (int i = 0; i < 100; i++)
    {
        v1.push_back(i);
        if (sz != v1.capacity())
        {
            sz = v1.capacity();
            cout << "v1当前容量:" << sz << endl;
            cout << "v1当前元素个数:" << v1.size() << endl;
        }
    }
    vector<int> v2;
    cout << "v2容量为:" << v2.capacity() << endl;
    cout << "v2元素个数:" << v2.size() << endl;
    v2.resize(10);
    cout << "v2当前容量为:" << v2.capacity() << endl;
    cout << "v2当前元素个数为:" << v2.size() << endl;
    for (int i = 0; i < v2.size(); i++)
    {
        cout << v2[i] << "  ";
    }
    cout << endl;
    vector<int> v3;
    cout << "v3容量为:" << v3.capacity() << endl;
    cout << "v3元素个数:" << v3.size() << endl;
    v3.resize(10, 3);
    cout << "v3当前容量为:" << v3.capacity() << endl;
    cout << "v3当前元素个数为:" << v3.size() << endl;
    for (int i = 0; i < v3.size(); i++)
    {
        cout << v3[i] << "  ";
    }
    cout << endl;
}

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值