本文介绍了std::vector中成员函数的用法,详细解释了如何如使用这些成员函数。本人对于STL来说,还是一个初学者。若本博文有什么错误,欢迎大家批评指正。下文中有用到迭代器,不懂的读者可以就把它当做一个指针,不然会很难理解。
vector头文件 #include<vector>;
vector的命名空间 using std::vector;
推荐使用全局的命名空间 using namespace std;
以(fast,last)区间创建一个vector。这里的fast,last指的是迭代器。可能很难理解,我来举个例子。我们先创建一个vector,然后利用这个vector的起始位置,结束位置再创建一个新的vector。然后输出这个新的vector。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>--------------------->
#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:
erase-------------------> 删除数据
均返回指向position位置的下一个数据的迭代器
it = s1.begin();
int arr[] = {400,500,600};
s1.insert(it,arr,arr+3);
两个实现
①iterator erase ( iterator position );
删除position位置的元素,
②iterator erase ( iterator first, iterator last );
删除从迭代器first指向位置到迭代器last所指向位置这一段的元素。不包括last所指向的数据。
均返回指向position位置的下一个数据的迭代器