C++容器之vector

简介

        Vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。Vector的内存是连续分配的,这一点和数组极其相似,不同的的地方是:数组是静态分配空间,一旦分配了大小,就不可能再改变;而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。

        Vector的扩充机制:按照容器现在容量的一倍进行增长。Vector容器分配的是一块连续的内存空间,每次容器增长,并不是在原有连续的内存空间后面进行简单的叠加,而是重新申请一块更大的新内存,并把容器中现有的元素逐个复制过去,然后销毁旧的内存。这时原有的内存空间的迭代器已经失效,所以当操作容器时,迭代器要及时更新。

成员函数


复制控制


vector:vector()

              构造函数:构造一个vector容器,根据构造函数的版本初始化容器中的元素。

vector:~vector()

        析构函数:销毁容器中的元素,销毁创建vector容器时分配的分内存空间

vector:opeartor=()

        赋值操作符:为容器分配新的元素以代替当前容器中的元素,并相应的改变其大小。

示例程序

#include <iostream>
#include <vector>

using namespace std;

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

int
main(void)
{
	// vector::vector construct
	vector<int> vec1;
	vector<int> vec2(5, 10);
	vector<int> vec3(vec2.begin(), vec2.end());
	vector<int> vec4(vec3);
	
	int arr[] = {1, 2, 3, 4, 5};
	vector<int> vec5(arr, arr + sizeof(arr)/sizeof(int));

	cout << "vec2 : ";
	print(vec2);
	
	cout << "vec3 : ";
	print(vec3);	
	
	cout << "vec4 : ";
	print(vec4);
	
	cout << "vec5 : ";
	print(vec5);
	
	// vector::operator=
	vector<int> vec6 = vec5;
	cout << "vec6 : ";
	print(vec6);
	
	return(0);
}

迭代器操作

vector::begin()/end()

        begin()返回指向vector容器第一个元素的迭代器。如果容器为空,返回值不能被引用。end()返回指向vector容器最后一个元素的下一个位置的迭代器。如果容器为空,它的返回值和vector::begin一样。它们返回值类型为vector<>::

iterator。

vector::rbegin()/rend()

            rbegin()返回一个倒序的迭代器,指向容器的最后一个元素。rend()返回指向vector容器第一个元素的前一个位置的迭代器。它们的返回值类型为vector<>::reverse_iterator。

vector::cbegin()/cend()

        这两个函数是vector::begin/end函数的const版本,其返回值类型为vector<>::const_iterator。

vector::crbegin()/crend()

        这两个函数是vector::rbegin/rend的const版本,其返回值类型为vector<>::const_reverse_iterator。

示例程序

#include <iostream>
#include <vector>

using namespace std;

int
main(void)
{
	vector<int> vec;
	
	for(int i = 0; i < 5; i++)
	{
		vec.push_back(i + 1);
	}
	// vector::begin end
	cout << "iterator : ";
	for(vector<int>::iterator it = vec.begin(); it != vec.end(); ++it)
	{
		cout << *it << " ";
	}
	cout << endl;
	
	// vector::rbegin rend
	cout << "reverse iterator : ";
	for(vector<int>::reverse_iterator it = vec.rbegin(); it != vec.rend(); ++it)
	{
		cout << *it << " ";
	}
	cout << endl;
	
	// vector::cbegin cend C++11
	cout << "const_iterator : ";
	for(vector<int>::const_iterator it = vec.cbegin(); it != vec.cend(); ++it)
	{
		cout << *it << " ";
	}
	cout << endl;
	
	// vector::crbegin crend C++11
	cout << "const_reverse_iterator : ";
	for(vector<int>::const_reverse_iterator it = vec.crbegin(); it != vec.crend(); ++it)
	{
		cout << *it << " ";
	}
	cout << endl;
	
	return(0);
}

Capacity

vector::size()

        返回容器中元素的个数,其值不一定和容器的capacity相等。返回值类型为vector::size_type。

vector::max_size()

        返回容器能存储元素个数的最大值。返回值类型为vector<>size_type。

vector::resize()

        改变容器大小,使其能存储n个元素。如果n的值比容器size要小的话,容器将只保留前面的n个元素,后面的元素将被移除并销毁。如果n的值比capacity值大,函数将会为容器重新分配大小为n的空间。

vector::capacity()

        返回容器实际被分配的存储空间大小。返回值类型为vector<>::size_type。

vector::empty()

        判断一个容器是否为空,空返回true,否则返回false。

vector::reserve()

        指定容器的capacity的大小。

vector::shrink_to_fit()

            根据容器实际存储的元素数量将将容器capacity修改成合适的大小。

示例程序

#include <iostream>
#include <vector>

using namespace std;

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

int 
main(void)
{
	vector<int> vec;
	
	// vector::size
	vector<int>::size_type actual_size = vec.size();
	cout << "The actual size : " << actual_size << endl;
	
	// vector::capacity
	vector<int>::size_type capacity_size = vec.capacity();
	cout << "Vector capacity size : " << capacity_size << endl;
	
	// vector::reserve
	vec.reserve(100);
	actual_size = vec.size();
	cout << "The actual size : " << actual_size << endl;
	capacity_size = vec.capacity();
	cout << "Vector capacity size : " << capacity_size << endl;
	
	//vector::push_back
	for(int i = 0; i < 10; i++)
	{
		vec.push_back(i+1);
	}
	actual_size = vec.size();
	cout << "The actual size  : " << actual_size << endl;
	capacity_size = vec.capacity();
	cout << "Vector capacity size : " << capacity_size << endl;
	
	// vector::shrink_to_fit C++11
	vec.shrink_to_fit();
	capacity_size = vec.capacity();
	cout << "Vector capacity size : " << capacity_size << endl;
	 
	// vector::max_size
	vector<int>::size_type max = vec.max_size();
	cout << "Vector max_siz : " << max << endl;
	
	// vector::empty
	if(!vec.empty())
	{
		// vector::back()
		cout << "The last value is : " << vec.back() << endl;
	}
	 
	// vector::resize
	vec.resize(5);
	cout << "Vector size : " << vec.size() << endl;
	cout << "vec : ";
	print(vec);	
	vec.resize(8, 10);
	cout << "Vector size : " << vec.size() << endl;
	cout << "vec : ";
	print(vec);
	vec.resize(10);
	cout << "Vector size : " << vec.size() << endl;
	cout << "vec : ";
	print(vec);
	
	return(0);
}

Element access

vector::operator[]

        返回容器位置n的元素的引用。

vector::at()

        返回容器位置n的元素的引用。

vector::front()

           返回容器第一个元素的引用。

vector::back()

        返回容器会后一个元素的引用。

vector::data()

        返回内存中容器实际存储地址的一个指针。

示例程序

#include <iostream>
#include <vector>

using namespace std;

int
main(void)
{
	vector<int> vec(5);
	
	// vector::operator[]
	for(int i = 0; i < 5; i++)
	{
		vec[i] = i + 1;
	}
	cout << "operator[] : ";
	for(int i = 0; i < 5; i++)
	{
		cout << vec[i] << " ";
	}
	cout << endl;
	
	// vector::at
	cout << "at : ";
	for(int i = 0; i < 5; i++)
	{
		cout << vec.at(i) << " ";
	}
	cout << endl;
	
	// vector::front
	cout << "The front element of vec is : " << vec.front() << endl;
	
	// vector::back
	cout << "The back element of vec is : " << vec.back() << endl;
	
	// vector::data C++11
	int *p = vec.data();
	cout << "The first element : " << *p << endl;
	*p = 10;
	p[1] = 20;
	cout << "vector::data : "; 
	for(int i = 0; i < 5; i++)
	{
		cout << vec[i] << " "; 
	}
	cout << endl;
}

Modifiers

vector::assign()

        为vector容器分配新的内容,以代替vector中原来的内容,vector大小也随之改变。

vector::push_back()

          在vector容器的尾部插入一个新的元素,将vector的大小加1。

vector::pop_back()

          删除vector容器的最后一个元素,将vector的大小减1。

vector::insert()

        在指定vector容器指定位置插入一个元素,将vector的大小加1。

vector::erase()

        删除vector容器中指定位置或范围的元素。

vector::swap()

        交互两个容器的元素,两个容器类型必须相同,大小可以不同。

vector::clear()

        清空一个vector容器,删除容器中所有的内容。

vector::emplace()

        构造并插入一个元素到vector容器指定位置。

vector::emplace_back()

        构造并插入一个元素到vector容器末尾。

示例代码

#include <iostream>
#include <vector>

using namespace std;

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

int
main(void)
{
	vector<int> vec1;
	vector<int> vec2;
	vector<int> vec3;
	vector<int>::iterator it;
	
	// vector::assign
	// void assign (size_type n, const value_type& val);
	vec1.assign(3, 100);
	// template <class InputIterator> 
	// void assign (InputIterator first, InputIterator last);
	vec2.assign(vec1.begin(), vec1.end());
	// void assign (initializer_list<value_type> il);
	int arr[] = {1, 2, 3};
	vec3.assign(arr, arr+3);
	cout << "Vec1 size : " << vec1.size() << endl;
	cout << "Vec2 size : " << vec2.size() << endl;
	cout << "Vec3 size : " << vec3.size() << endl;
	
	// vector::push_back
	vec3.push_back(4);
	cout << "The last number of vec3 : " << vec3.back()<< endl;
	
	// vector::pop_back
	cout << "vec3 last value : " << vec3.back() << endl;
	vec3.pop_back();
	cout << "vec3 : ";
	print(vec3);
	
	// vector::insert
	it = vec3.begin();
	// iterator insert (const_iterator position, 
const value_type& val);
	it = vec3.insert(it, 200);
	cout << "vec3 : ";
	print(vec3);
	// iterator insert (const_iterator position, size_type n, 
	// const value_type& val);
	vec3.insert(it, 2, 300);
	cout << "vec3 : ";
	print(vec3);
	// template <class InputIterator> iterator 
insert (const_iterator position, 
	// InputIterator first, InputIterator last);
	vec3.insert(it+2, vec2.begin(), vec2.end());
	print(vec3);
	vec3.insert(vec3.begin(), arr, arr+3);
	print(vec3);
	
	// vector::erase
	// erase the last one
	vec3.erase(vec3.begin() + vec3.size() - 1);
	print(vec3);
	// erase the first 3 elements;
	vec3.erase(vec3.begin(), vec3.begin() + 3);
	print(vec3);
	
	// vector::swap
	vec3.swap(vec2);
	cout << "vec2 contains : ";
	print(vec2);
	cout << "vec3 contains : ";
	print(vec3);
	
	// vector::emplace
	vec3.emplace(vec3.begin(), 200);
	cout << "vec3 : ";
	print(vec3);
	vec3.emplace(vec3.begin() + 2, 300);
	cout << "vec3 : ";
	print(vec3);
	vec3.emplace(vec3.end(), 400);
	cout << "vec3 : ";
	print(vec3);
	//vector::emplace_back
	vec3.emplace_back(500);
	print(vec3);
	
	// vector::clear
	vec3.clear();
	cout << "vec2 size : " << vec3.size() << endl;	
	
	return(0);
}


vector<bool>

        vector<bool>是vector的特殊版本,它的元素类型为bool。在使用上和vector普通版本基本一致,其中修改了swap()的用法,增加了filp()函数。

示例代码

#include <iostream>
#include <vector>

using namespace std;

void
print(vector<bool> vec)
{
	for(vector<bool>::const_iterator it = vec.cbegin(); it != vec.cend(); ++it)
	{
		cout << *it << " ";
	}
	cout << endl;
}

int
main(void)
{
	vector<bool> vec1;
	vector<bool> vec2;
	vector<bool>::iterator it;
	
	vec1.push_back(true);
	vec1.push_back(false);
	vec1.push_back(true);
	
	vec2.push_back(true);
	vec2.push_back(false);
	// vector<bool>::swap
	vec1.swap(vec1[0], vec1[1]);
	cout << "vec1 : ";
	print(vec1);
	
	vec2.swap(vec2.front(), vec2.back());
	cout << "vec2 : ";
	print(vec2);
	
	vec1.swap(vec2);
	cout << "vec1 : ";
	print(vec1);
	cout << "vec2 : ";
	print(vec2);
	
	// vector<bool>::flip
	cout << "Before flip : ";
	print(vec1);
	vec1.flip();
	cout << "After flip : ";
	print(vec1);
	
	return(0);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值