【STL】vector函数用法总结


   本文介绍了std::vector中成员函数的用法,详细解释了如何如使用这些成员函数。本人对于STL来说,还是一个初学者。若本博文有什么错误,欢迎大家批评指正。下文中有用到迭代器,不懂的读者可以就把它当做一个指针,不然会很难理解。



vector头文件 #include<vector>;

vector的命名空间 using std::vector;

推荐使用全局的命名空间 using namespace std;


vector构造函数

vector<type> s;   ---------------->
创建一个空的vector;

vector<type> s(n)---------------->
创建一个大小为n的vector,含有n个数据,数据均已调用type的缺省构造函数初始化;

vector<type> s(n,num)----------------- >
创建一个含有n个数据的vector,数据均初始化为num。

vector<type> s<fast,last>--------------------->
   以(fast,last)区间创建一个vector。这里的fast,last指的是迭代器。可能很难理解,我来举个例子。我们先创建一个vector,然后利用这个vector的起始位置,结束位置再创建一个新的vector。然后输出这个新的vector。

#include<iostream>
#include<vector>
using namespace std;
void test()
{
	vector<int> s2;
	s2.push_back(1);
	s2.push_back(2);
	s2.push_back(3);
	s2.push_back(4);
	s2.push_back(5);
	s2.push_back(6);
	vector<int> s1(s2.begin(),s2.end());
	vector<int>::iterator it1 = s1.begin();// 创建一个迭代器指向s1的起始位置。
	while(it1 != s1.end())
	{
		cout<<*it1<<" ";
		it1++;
	}
}
int main()
{
      test();
      return 0;
}</span>

执行结果:




vector<type>  s(s1)-------------------->
拷贝构造,利用s1复制一个s。

vector析构函数

~vector<type>()------------------------>
销毁所有数据,释放内存。

iterators(迭代器)

正向迭代器

s.begin()---------------------------->
返回指向s起始位置的迭代器。
s.end()------------------------------>
返回指向s最后一个数据下一个位置的迭代器。

反向迭代器

s.rbegin()-------------------------->
返回指向最后一个数据的迭代器。
s.rend()---------------------------->
返回指向第一个数据前一个位置的迭代器。


ELEMENT ACCESS(元素使用)

operator[]---------------------->
[]运算符重载,利用[]+下标来访问元素。

s.front()---------------------------->
返回第一个元素。

s.back()--------------------------->
返回最后一个元素。

at-------------------------------->
返回一个元素的引用位置。当访问越界时,它会自动抛出out_of_range。

eg:
vector< const int > s3(10);
s3.at(2) = 1;//将s3中下标为2的数据改为1.</span>


c++ Reference里面,它有两个实现。
①const_reference at ( size_type n ) const;
②reference at ( size_type n );

CAPACITY(容量操作)

s.size()--------------->获得s的size.

s.max_size()---------->最大能存储对象的个数。不同大小的数据,max_size不同。

eg:
vector< int> s1;
vector< char> s2;
cout<< "int:"<<s1.max_size()<<endl;
cout<< "char:"<<s2.max_size()<<endl;

执行结果:


          

s.empty()------------->判断s是否为空,空返回true,非空返回false。

s.capacity()----------->获得s的容量capacity。

reserve---------------->请求改变容量。

实现:void reserve ( size_type n );
当n>capacity时,扩容。
当n<capacity时,容量不变。


resize------------------>重新分配size。

实现:void resize ( size_type sz, T c = T() );
返回值为空。

功能:

①改变容量,增容。

当本容器的容量capacity 小于 sz 时,resize会给容器扩容。多出来的容量会初始化成T类型的c。若没有给出c这个参数,则默认为T类型匿名对象,值一般为0。
eg1:(没有给参数c)
        
                vector< int> s1;
                s1.push_back(1);
                s1.push_back(2);
                s1.push_back(3);
                s1.push_back(4);
                s1.push_back(5);
                s1.push_back(6);
                s1.push_back(7);
                vector< int>::iterator it =  s1.begin();
                s1.resize(9);
                 while(it != s1.end())
                {
                                cout<<*it<< " ";
                                it++;
                }

执行结果:



eg2:(给出参数c)

                vector< int> s1;
                s1.push_back(1);
                s1.push_back(2);
                s1.push_back(3);
                s1.push_back(4);
                s1.push_back(5);
                s1.push_back(6);
                s1.push_back(7);
                vector< int>::iterator it =  s1.begin();
                s1.resize(9,100);
                 while(it != s1.end())
                {
                                cout<<*it<< " ";
                                it++;
                }

执行结果:


注意:

   当sz > capacity时。resize会重新开辟一块空间给本容器。此时,在resize之前创建的迭代器将会失效。上面的两个例子,我请求的sz为9, 我在输出时用的迭代器是在resize之前创建的,在输出时并没有报错。如果我请求sz为12呢?(注意容器的容量capacity)


②改变size 删除添加数据
当请求的sz小于容器的size时,resize会删除多余的数据。
eg:
                vector< int> s1;
                s1.push_back(1);
                s1.push_back(2);
                s1.push_back(3);
                s1.push_back(4);
                s1.push_back(5);
                s1.push_back(6);
                s1.push_back(7);
                vector< int>::iterator it =  s1.begin();
                s1.resize(2);
                 while(it != s1.end())
                {
                                cout<<*it<< " ";
                                it++;
                }

执行结果:






MODIFIERS(编辑器,修改器)

push_back--------------------> 尾插一个元素

pop_back--------------------->  尾删一个元素

assign-------------------------->赋值

两个实现:

① template <class InputIterator>
  void assign ( InputIterator first, InputIterator last );

将区间(first,last)内的数据赋值到当前vector的容器内。这个容器会清除掉以前vector容器内的内容。
容器的size,capacity都会被改变。
eg:

    

                vector< int> s1;
                vector< int> s2;

                s1.push_back(1);
                s1.push_back(2);

                s2.push_back(1);
                s2.push_back(2);
                s2.push_back(3);
                s2.push_back(4);
                s2.push_back(5);
                s2.push_back(6);

                 int arr[9] = {2,3,1,3,4,5,4,6,2};
                cout<< "capacity:"<<s1.capacity()<<endl;
                cout<< "size:"<<s1.size()<<endl;
                cout<< "s1(原-):";
                vector< int>::iterator it1 = s1.begin();
                 while(it1 != s1.end())
                {
                                cout<<*it1<< " ";
                                it1++;
                }
                cout<<endl;
                cout<<endl;


                s1.assign(s2.begin(),s2.end());//将区间(s2.begin(),s2.end())的值赋给s1
                cout<< "capacity:"<<s1.capacity()<<endl;
                cout<< "size:"<<s1.size()<<endl;
                cout<< "s1(s2):";
                vector< int>::iterator it = s1.begin();
                 while(it != s1.end())
                {
                                cout<<*it<< " ";
                                it++;
                }
                cout<<endl;
                cout<<endl;
                cout<<endl;
                s1.assign(arr,arr+6);//将区间(arr,arr+6)的值赋给s1
                cout<< "capacity:"<<s1.capacity()<<endl;
                cout<< "size:"<<s1.size()<<endl;
                cout<< "s1(arr):";
                vector< int>::iterator iter = s1.begin();
                 while(iter != s1.end())
                {
                                cout<<*iter<< " ";
                                iter++;
                }

执行结果:



②void assign ( size_type n, const T& u );

赋n个值为u的数据到容器中,原数据会被清空。

                vector<int> s2;
                s2.push_back(1);
                s2.push_back(2);
                s2.push_back(3);
                s2.push_back(4);
                s2.push_back(5);
                s2.push_back(6);
                s2.assign(4,1);
                cout<< "s2(原-)";
                vector< int>::iterator iter1 = s2.begin();
                 while(iter1 != s2.end())
                {
                                cout<<*iter1<< " ";
                                iter1++;
                }
                cout<<endl;
                s2.assign(4,1);
                cout<< "s2(assign后??):?o" ;
                vector< int>::iterator iter = s2.begin();
                 while(iter != s2.end())
                {
                                cout<<*iter<< " ";
                                iter++;
                }


执行结果:





swap()------------------------>交换两个容器。

这个直接看例子。


eg:

vector< int> s1(3,100);
vector< int> s2(5,200);
//输出交换前各容器的容量
cout<< "s1:"<<s1.capacity()<<endl;
cout<< "s2:"<<s2.capacity()<<endl;
s1.swap(s2);//s1与s2交换
//输出交换后各容器的容量
cout<< "s1:"<<s1.capacity()<<endl;
cout<< "s2:"<<s2.capacity()<<endl;
//输出s1
vector< int>::iterator it1 =  s1.begin();
cout<< "s1:";
while(it1 != s1.end())
{
	cout<<*it1<< " ";
	it1++;
}
cout<<endl;
//输出s2
vector< int>::iterator it2 =  s2.begin();
cout<< "s2:";
while(it2 != s2.end())
{
	cout<<*it2<< " ";
	it2++;
}
cout<<endl;
</span>

执行结果:





clear-------------->

清空所有数据,容量并不会被改变。


vector< int> s1;
s1.push_back(1);
s1.push_back(2);
s1.push_back(3);
s1.push_back(4);
s1.push_back(5);
s1.reserve(0);
vector< int>::iterator it =  s1.begin();
//输出clear前容量
cout<< "clear前:" <<s1.capacity()<<endl;
while(it != s1.end())
{
	cout<<*it<< " ";
	it++;
}
cout<<endl;
s1.clear();
//输出clear后容量
cout<< "clear后:" <<s1.capacity()<<endl;
vector< int>::iterator iter =  s1.begin();
while(iter != s1.end())
{
	cout<<*iter<< " ";
	iter++;
}
cout<<endl;</span>

执行结果:





insert--------------------->插入数据

三个实现:

①iterator insert ( iterator position, const T& x );
在positon之前插入一个数据x,并返回指向这个数据的迭代器

②void insert ( iterator position, size_type n, const T& x );
在position之前插入 n 个 x。

③template <class InputIterator>
void insert ( iterator position, InputIterator first, InputIterator last );
在position位置之前,插入从first到last的一段数据

eg:
it = s1.begin();
int arr[] = {400,500,600};
s1.insert(it,arr,arr+3);


erase-------------------> 删除数据

两个实现

①iterator erase ( iterator position );
删除position位置的元素,

②iterator erase ( iterator first, iterator last );
删除从迭代器first指向位置到迭代器last所指向位置这一段的元素。不包括last所指向的数据。

均返回指向position位置的下一个数据的迭代器


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值