vector in C++相关知识点
上次看到一个题用到vector使解法非常精妙,后来的做题过程中老想着用vector试试,但是苦于了解有限。这里好好做个笔记整理一下
vector概念&常用场景
向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。(摘自菜鸟教程,侵删)
以下场景我会很想用到vector:
1.某一串需要处理的数,是没有固定大小的,需要实时添加、删除。(但是vector不能根据数值来进行删除,这点可能不适用)
2.某一串需要处理的数,数据的顺序也是不固定的,需要运行过程中按照输入条件做实时调整的
“Compared to the other dynamic sequence containers (deques, lists and forward_lists), vectors are very efficient accessing its elements (just like arrays) and relatively efficient adding or removing elements from its end.For operations that involve inserting or removing elements at positions other than the end, they perform worse than the others, and have less consistent iterators and references than lists and forward_lists”
这段话即涉及在非结尾位置插入或删除元素的操作,性能会比较差,而且迭代器和引用的一致性比别的容器差。也就是vector其实不适合需要对容器中间位置元素,做频繁操作的场景。
常用函数
#include<vector> vector<int> vectors;//新建一个存放int型的vector //单纯在队尾进行操作 void push_back(x);//在向量尾部增加一个元素x void pop_back();//删除向量中最后一个元素 //插入删除操作 iterator insert(iterator it,const T& x);//向量中迭代器指向元素前增加一个元素x iterator erase(iterator it);//删除向量中迭代器指向元素,返回值指向已删除元素的下一个位置 iterator erase(iterator first,iterator last);//删除向量中[first,last)中元素
iterator erase(const_iterator __first, const_iterator __last); //遍历操作,找某个指定值 reference at(int pos);//返回pos位置元素的引用 reference front();//返回首元素的引用 reference back();//返回尾元素的引用 iterator begin();//返回向量头指针,指向第一个元素 iterator end();//返回向量尾指针,指向向量最后一个元素的下一个位置 //其他全局操作 bool empty();//判断向量是否为空 void clear();//清空向量中所有元素 int size();//返回向量中元素的个数
//对vector中的元素进行排序操作
sort(vectors.begin(),obj.end());//从小到大排序
reverse(obj.end(),obj.begin());//反序输出,也就是按照上面的从小到大排序方法,然后反序,即从大到小输出
//返回vector的最后一个元素
return vector.at(vector.size()-1);
return vector.back();
return vector.end()-1;
//返回vector的第一个元素
return vector[0];
return vector.front();
return *vector.begin();
return vector.at(0);
可以看到比如erase()函数,有iterator和const_iterator,区别是什么呢?
所有的标准库容器都定义了相应的迭代器类型,现代 C++ 程序更倾向于使用迭代器而不是下标操作访问容器元素。
member type | definition | notes |
---|---|---|
value_type | The first template parameter (T) | |
allocator_type | The second template parameter (Alloc) |
defaults to: allocator <value_type> |
reference | value_type& | |
const_reference | const value_type& | |
pointer | allocator_traits<allocator_type>::pointer | for the default allocator: value_type* |
const_pointer | allocator_traits<allocator_type>::const_pointer | for the default allocator: const value_type* |
iterator | a random access iterator to value_type | convertible to const_iterator |
const_iterator | a random access iterator to const value_type | |
reverse_iterator | reverse_iterator<iterator> | |
const_reverse_ iterator |
reverse_iterator<const_iterator> | |
difference_type | a signed integral type, identical to: iterator_traits<iterator>::difference_type |
usually the same as ptrdiff_t |
size_type | an unsigned integral type that can represent any non-negative value of difference_type |
usually the same as size_t |
总的来说就是,iterator可以改变它指向的元素值,但是加上const之后只能改自己的值,也就是可以指向其他元素,而不能改变它指向的元素。
实际应用(利用迭代器访问)
#include <string.h> #include <vector> #include <iostream> #include <algorithm> using namespace std; int main() { vector<int>obj; for(int i=0;i<10;i++) { obj.push_back(i); } vector<int>::iterator it;//声明一个迭代器,来访问vector容器,作用:遍历或者指向vector容器的元素 for(it=obj.begin();it!=obj.end();it++) { cout<<*it<<" "; //输出0 1 2 3 4 5 6 7 8 9 } return 0; }
或者还可以通过访问vector的下标来进行输出,也就是obj[0]~obj[9]。