本文介绍了std::vector中成员函数的用法,详细解释了如何如使用这些成员函数。本人对于STL来说,还是一个初学者。若本博文有什么错误,欢迎大家批评指正。下文中有用到迭代器,不懂的读者可以就把它当做一个指针,不然会很难理解。
vector头文件 #include
;
vector的命名空间 using std::vector;
推荐使用全局的命名空间 using namespace std;
以(fast,last)区间创建一个vector。这里的fast,last指的是迭代器。可能很难理解,我来举个例子。我们先创建一个vector,然后利用这个vector的起始位置,结束位置再创建一个新的vector。然后输出这个新的vector。vector构造函数
vectors; ----------------> 创建一个空的vector;
vectors(n)----------------> 创建一个大小为n的vector,含有n个数据,数据均已调用type的缺省构造函数初始化;
vectors(n,num)----------------- > 创建一个含有n个数据的vector,数据均初始化为num。
vectors --------------------->
#include
#include using namespace std; void test() { vector 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 s1(s2.begin(),s2.end()); vector ::iterator it1 = s1.begin();// 创建一个迭代器指向s1的起始位置。 while(it1 != s1.end()) { cout<<*it1<<" "; it1++; } } int main() { test(); return 0; }
执行结果:
vectors(s1)--------------------> 拷贝构造,利用s1复制一个s。
vector析构函数
~vector()------------------------> 销毁所有数据,释放内存。
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.
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:
s.empty()------------->判断s是否为空,空返回true,非空返回false。
s.capacity()----------->获得s的容量capacity。
reserve---------------->请求改变容量。
实现:void reserve ( size_type n );当n>capacity时,扩容。当n
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 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:"<::iterator it1 = s1.begin();
while(it1 != s1.end())
{
cout<<*it1<< " ";
it1++;
}
cout<::iterator it = s1.begin();
while(it != s1.end())
{
cout<<*it<< " ";
it++;
}
cout<::iterator iter = s1.begin();
while(iter != s1.end())
{
cout<<*iter<< " ";
iter++;
}
执行结果:
②void assign ( size_type n, const T& u );
赋n个值为u的数据到容器中,原数据会被清空。
vector 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<::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:"<::iterator it1 = s1.begin();
cout<< "s1:";
while(it1 != s1.end())
{
cout<<*it1<< " ";
it1++;
}
cout<::iterator it2 = s2.begin();
cout<< "s2:";
while(it2 != s2.end())
{
cout<<*it2<< " ";
it2++;
}
cout<
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前:" <::iterator iter = s1.begin();
while(iter != s1.end())
{
cout<<*iter<< " ";
iter++;
}
cout<
it = s1.begin();
int arr[] = {400,500,600};
s1.insert(it,arr,arr+3);