c++标准模板库-------容器使用

本文详细介绍了C++标准库中的vector容器的使用方法,包括构造函数、成员函数及常用操作,通过实例展示了如何创建、操作和管理vector,帮助读者深入理解vector的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.使用vector的头文件#include<vector>

2. 构造函数:vector<类型 > 标识符(最大容量,初始所有值);

语法:

vector();

vector( size_typenum, const TYPE &val );

vector( const vector&from );

vector(input_iterator start, input_iterator end );

无参数 ----构造一个空的vector;

数量(num)和值(val) ------构造一个初始放入num个值为val的元素的Vector;

vector(from)------构造一个与vectorfrom 相同的vector;

迭代器(start)和迭代器(end) - 构造一个初始值为[start,end)区间元素的Vector(注:半开区间).

3. back 函数

语法: TYPEback();

back() 函数返回当前vector最末一个元素的引用.

front 函数

语法: TYPEfront();

front() 函数返回当前vector起始元素的引用

例如:  

vector<int> v; 
	for( int i = 0; i < 5; i++ )
		v.push_back(i);
	cout<<"The first element is "<<v.front()<<" and the last element is "<<v.back()<<endl; 
这段代码产生如下结果:  The first element is0 and the last element is 4

4. begin 函数

语法: iteratorbegin();

 begin()函数返回一个指向当前vector起始元素的迭代器

end 函数

语法: iteratorend();

 end() 函数返回一个指向当前vector末尾元素的下一位置的迭代器.注意,如果你要访问末尾元素,需要先将此迭代器自减1.

例如,下面这段使用了一个迭代器来显示出vector中的所有元素: 

vector<int> v1( 5, 789 );
vector<int>::iterator it; 
for( it = v1.begin(); it != v1.end(); it++ ) 
cout << *it << endl;

5. capacity 函数

语法: size_typecapacity();

capacity() 函数 返回当前vector在重新进行内存分配以前所能容纳的元素数量.

例如1:

vector<int> v1; 
cout <<v1.capacity()<< endl

 结果为0

例如2:

vector<int> v1( 5, 789 ); 
cout <<v1.capacity()<< endl;
结果为5

6. clear 函数

语法: voidclear();

 clear()函数删除当前vector中的所有元素.

例如:

<pre name="code" class="csharp">vector<int> v1( 5, 789 ); 
v1.clear();
vector<int>::iterator it;  
for( it = v1.begin(); it != v1.end(); it++ ) 
     cout << *it << endl;


 输出为空

7. empty 函数

语法: bool empty();

empty() 如果当前vector没有容纳任何元素,则empty()函数返回true,否则返回false.例如,以下代码清空一个vector,并按照逆序显示所有的元素:

vector<int> v;  
	for( int i = 0; i < 5; i++ )
		v.push_back(i);   
	while( !v.empty() )
	{
		cout << v.back() << endl; 
		v.pop_back(); 
	}

8. erase 函数

语法:

iterator erase( iterator loc );

iterator erase( iterator start, iteratorend );

erase ()函数要么删作指定位置loc的元素;要么删除区间[start, end)的所有元素.返回值是指向删除的最后一个元素的下一位置的迭代器.

例如: 

// 创建一个vector,置入字母表的字符
//a(alphaVector);t(tempIterator);s(startIterator)
	vector<char> a; 
	for(int i=0; i < 26; i++ )      
		a.push_back( i + 'A'); 
	int size = a.size(); 
	vector<char>::iterator s; 
	vector<char>::iterator t;
	for(i=0; i<size; i++ ) 
	{      
		s=a.begin();      
		for( t= a.begin();t!=a.end();t++ )   
			cout << *t;    
		cout << endl; 
        a.erase(s);  
	}

9. front()函数返回当前vector起始元素的引用

10. insert 函数

iterator insert(iterator loc, const TYPE &val ); 

void insert(iterator loc, size_type num, const TYPE &val ); 

void insert(iterator loc, input_iterator start, input_iterator end );

insert() 函数有以下三种用法:  

在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器, 

在指定位置loc前插入num个值为val的元素  

在指定位置loc前插入区间[start, end)的所有元素 .

例如:

#include <iostream>
#include<vector>
using namespace std;
int main()
{
	vector<char> a;
	for( int i=0; i < 10; i++ )
		a.push_back( i + 65 );
	//在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器,
	vector<char>::iterator  t1 = a.begin()+5;
	a.insert( t1 ,'C' );
	vector<char>::iterator t;
	for( t = a.begin(); t!= a.end(); t++ )
		cout << *t;
	cout<<endl;
	//在指定位置loc前插入4个值为*的元素 
	vector<char>::iterator t2 = a.begin();
	a.insert( t2 , 4, '*' );
	for( t = a.begin(); t!= a.end(); t++ )
		cout << *t;
	cout<<endl;
	//在指定位置loc前插入区间[start, end)的所有元素 
	vector<char>::iterator t3 = a.begin();
	a.insert( t3 , t2 , t1 );
	//显示vector的内容
	for( t = a.begin(); t!= a.end(); t++ )
		cout << *t;
	cout<<endl;
return 0;
}

11. 语法: void pop_back();

pop_back() 函数删除当前vector最末的一个元素,

例如:

#include <iostream>
#include<vector>
using namespace std;
int main()
{
	vector<char> alphaVector;
	for( int i=0; i < 10; i++ )
		alphaVector.push_back( i + 65 );
	int size = alphaVector.size();
	vector<char>::iterator theIterator;
	for(  i=0; i < size; i++ )
	{
		alphaVector.pop_back();
		for( theIterator = alphaVector.begin(); theIterator != alphaVector.end(); theIterator++ )
			cout << *theIterator;
		cout << endl;
}
    return 0;
}

11. push_back()添加值为val的元素到当前vector末尾

12. rbegin 函数
语法: reverse_iterator rbegin();

rbegin函数返回指向当前vector末尾的逆迭代器.(译注:实际指向末尾的下一位置,而其内容为末尾元素的值,详见逆代器相关内容)

例如:

#include <iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int>v1;
	for(int i=1;i<=5;i++)
	{
		v1.push_back(i);
	}
	vector<int>::reverse_iterator pos;
	pos=v1.rbegin();
	cout<<*pos<<" ";
	pos++;
	cout<<*pos<<" ";
	pos++;
	cout<<*pos<<endl;
   return 0;
}

输出结果为:5 4 3

13. rend 函数
语法: reverse_iterator rend();

rend()函数返回指向当前vector起始位置的逆迭代器.

例如:

#include <iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int>v1;
	for(int i=1;i<=5;i++)
	{
		v1.push_back(i);
	}
	vector<int>::reverse_iterator pos;
	pos=v1.rend();
	pos--;
	cout<<*pos<<" ";
	pos--;
	cout<<*pos<<" ";
	pos--;
	cout<<*pos<<" ";
	pos--;
	cout<<*pos<<endl;

   return 0;
}	

输出结果为:1 2 3 4

14. reserve 函数

语法: voidreserve( size_type size );

reserve()函数为当前vector预留至少共容纳size个元素的空间.(译注:实际空间可能大于size)

resize 函数

语法: voidresize( size_type size, TYPE val );

resize() 函数改变当前vector的大小为size,且对新创建的元素赋值val

resize 与reserve的区别

    reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用容器内的元素,因此当加入新的元素时,需要用push_back()/insert()函数。

    resize是改变容器的大小,并且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。再者,两个函数的形式是有区别的,reserve函数之后一个参数,即需要预留的容器的空间;resize函数可以有两个参数,第一个参数是容器新的大小,第二个参数是要加入容器中的新元素,如果这个参数被省略,那么就调用元素对象的默认构造函数。

初次接触这两个接口也许会混淆,其实接口的命名就是对功能的绝佳描述,resize就是重新分配大小,reserve就是预留一定的空间。这两个接口即存在差别,也有共同点。下面就它们的细节进行分析。

为实现resize的语义,resize接口做了两个保证:一是保证区间[0, new_size)范围内数据有效,如果下标index在此区间内,vector[indext]是合法的。二是保证区间[0, new_size)范围以外数据无效,如果下标index在区间外,vector[indext]是非法的。

     reserve只是保证vector的空间大小(capacity)最少达到它的参数所指定的大小n。在区间[0, n)范围内,如果下标是index,vector[index]这种访问有可能是合法的,也有可能是非法的,视具体情况而定。

     resize和reserve接口的共同点是它们都保证了vector的空间大小(capacity)最少达到它的参数所指定的大小。

因两接口的源代码相当精简,以至于可以在这里贴上它们:

voidresize(size_type new_size) { resize(new_size, T()); }

voidresize(size_type new_size, const T& x) {

    if (new_size < oldsize)

      erase(oldbegin + new_size, oldend); //erase区间范围以外的数据,确保区间以外的数据无效

    else

      insert(oldend, new_size - oldsize, x); //填补区间范围内空缺的数据,确保区间内的数据有效

示例:

#include <iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int>v1;
	for(int i=1;i<=3;i++)
	{
		v1.push_back(i);
	}
	v1.resize(5,8);//多出的两个空间都初始化为8,
	for(i=0;i<v1.size();i++)//resize与reserver并不会删除原先的元素以释放空间
	{
		cout<<v1[i]<<" ";
	}
	cout<<endl;
	v1.reserve(7);// 新元素还没有构造,
    for(i=0;i<7;i++)
	{
		cout<<v1[i]<<" ";//当i>4,此时不能用[]访问元素 
	}
	cout<<endl;
	cout<<v1.size()<<endl;
	cout<<v1.capacity()<<endl;
    return 0;
}

输出结果为:

1 2 3 8 8

1 2 3 8 8 -842150451-842150451

5

7

15. 语法: size_type size();
size() 函数返回当前vector所容纳元素的数目

16. swap 函数
语法: void swap( vector &from );
swap()函数交换当前vector与vector from的元素
例如:

#include <iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int>v1,v2;
	for(int i=1;i<=3;i++)
	{
		v1.push_back(i);
        v2.push_back(i);
	}
	v2.push_back(4);
	v2.push_back(5);
	v1.swap(v2);
	for(int j=0;j<v1.size();j++)
	{
		cout<<v1[j]<<" ";
	}
	cout<<endl;
	for(int k=0;k<v2.size();k++)
	{
		cout<<v2[k]<<" ";
	}
	cout<<endl;
    return 0;
}

输出结果为:

1 2 3 4 5

1 2 3

17. assign函数

语法:

void assign(input_iterator start, input_iterator end );

void assign(size_type num, const TYPE &val );

assign() 函数要么将区间[start, end)的元素赋到当前vector,或者赋num个值为val的元素到vector中.这个函数将会清除掉为vector赋值以前的内容.

18. at函数

语法: TYPE at(size_type loc );

at() 函数 返回当前Vector指定位置loc的元素的引用. at() 函数 比[] 运算符更加安全, 因为它不会让你去访问到Vector内越界的元素.

例如:

#include <iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int> v( 5, 1 );
	for( int i = 0; i < 10; i++ ) 
	{
		cout << "Element " << i << " is " << v[i] << endl;
	}
    return 0;
}

这段代码访问了vector末尾以后的元素,这将可能导致很危险的结果.

以下的代码将更加安全:

#include <iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int> v( 5, 1 );
	for( int i = 0; i < 10; i++ ) 
	{
		cout << "Element " << i << " is " << v.at(i) << endl;
	}
    return 0;
}

取代试图访问内存里非法值的作法,at() 函数能够辨别出访问是否越界并在越界的时候抛出一个异常out_of_range.


以下程序是对容器的一个整合:

#include <iostream>
#include<stdio.h>
#include<vector>
using namespace std;
//构造的printf函数:输出容器中元素的函数
void dprintf(vector<int> v)
{
    for(int i=0;i<v.size();i++)
        cout<<v[i]<<" ";
        //cout<<v.at(i)<<" ";
        //
    cout<<endl;
}
int main()
{
    //构造空容器v1
    vector<int> v1;
    //初始放入7个3的容器v2
    vector<int> v2(7,3);
    //构造一个与容器v2相同的容器v3
    vector<int> v3(v2);
    //定义迭代器start和end,并初始化
    vector<int>::iterator start=v2.begin(),end=v2.begin()+5;
    //构造一个初始值为[start,end)区间元素的容器v4
    vector<int> v4(start,end);
    //输出容器v1中的元素
    cout<<"容器v1:"<<endl;
    dprintf(v1);
    //输出容器v2中的元素
    cout<<"容器v2:"<<endl;
    dprintf(v2);
    //输出容器v3中的元素
    cout<<"容器v3:"<<endl;
    dprintf(v3);
    //输出容器v4中的元素
    cout<<"容器v4:"<<endl;
    dprintf(v4);
    //输出容器v1中的元素
    cout<<"容器v2与容器v3相等:"<<endl;
    if(v2==v3)
        cout<<"true"<<endl;
    //对容器v2重新赋值
    v2.assign(9,2);
    //输出赋新值后容器v2中的元素
    cout<<"v2.assign(9,2)容器v2:"<<endl;
    dprintf(v2);
    //在容器v2最后添加元素
    for(int i=5;i<10;i++)
    {
        v2.push_back(i);
    }
    cout<<"v2.push_back(i)容器v2:"<<endl;
    dprintf(v2);
    //在容器v3中插入元素
    vector<int>::iterator  t1,t2,t3,t4,t5;//定义迭代器t1,t2,t3,t4,t5
    t1=v3.begin()+3;//t1的初始值指向容器v3的第三个位置
    v3.insert(t1,7);//将7插入t1所指位置
    cout<<"v3.insert(t1,7)容器v3:"<<endl;
    dprintf(v3);
    t2=v3.begin();//t2的初始值指向容器v3的第一个位置
    v3.insert(t2,3,4);//从t2位置开始插入3个4
    cout<<"v3.insert(t1,3,9)容器v3:"<<endl;
    dprintf(v3);
    t3=v3.begin()+6;//t3的初始值指向容器v3的第六个位置
    t4=v3.begin()+8;//t4的初始值指向容器v3的第八个位置
    t5=v2.begin();//t5的初始值指向容器v2的第一个位置
	v2.insert(t5,t3,t4);//在容器v2的第一个位置插入容器v3第六到第八个元素
	cout<<"v2.insert(t3,t2,t1)容器v2:"<<endl;
    dprintf(v2);
    //移除容器v2最后一个元素
    v2.pop_back();
    cout<<"v2.pop_back()容器v2:"<<endl;
    dprintf(v2);
    //交换容器v1和v2
    v4.swap(v2);
    cout<<"v4.swap(v2)容器v4:"<<endl;
    dprintf(v4);
    cout<<"v4.swap(v2)容器v2:"<<endl;
    dprintf(v2);
    //返回容器v2,v3,v4第一个元素的值,容器v1为空,不能返回
    printf("v2.front()=%d\n",v2.front());//cout<<"v2.front()="<<v2.front()<<endl;
    printf("v3.front()=%d\n",v3.front());//cout<<"v3.front()="<<v3.front()<<endl;
    printf("v4.front()=%d\n",v4.front());//cout<<"v4.front()="<<v4.front()<<endl;
    //返回容器v2,v3,v4最末一个元素的值,容器v1为空,不能返回
    printf("v2.back()=%d\n",v2.back());//cout<<"v2.back()="<<v2.back()<<endl;
    printf("v3.back()=%d\n",v3.back());//cout<<"v3.back()="<<v3.back()<<endl;
    printf("v4.back()=%d\n",v4.back());//cout<<"v4.back()="<<v4.back()<<endl;
    //size()输出容器v1,v2,v3,v4元素数量的大小
    //capacity()输出容器v1,v2,v3,v4所能容纳元素的数量
    cout<<"v1.size()="<<v1.size()<<endl;//printf("v1.size()=%d",v1.size());
    cout<<"v1.capacity()="<<v1.capacity()<<endl;//printf("v1.capacity()=%d",v1.capacity());
    cout<<"v2.size()="<<v2.size()<<endl;//printf("v2.size()=%d",v2.size());
    cout<<"v2.capacity()="<<v2.capacity()<<endl;//printf("v2.capacity()=%d",v2.capacity());
    cout<<"v3.size()="<<v3.size()<<endl;//printf("v3.size()=%d",v3.size());
    cout<<"v3.capacity()="<<v3.capacity()<<endl;//printf("v3.capacity()=%d",v3.capacity());
    cout<<"v4.size()="<<v4.size()<<endl;//printf("v4.size()=%d",v4.size());
    cout<<"v4.capacity()="<<v4.capacity()<<endl;//printf("v4.capacity()=%d",v4.capacity());
    return 0;
}
















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值