DEV Community

Ariston
Ariston

Posted on • Edited on

STL容器用法大全

引出:freestanding和hosted的区别:一个是可以在没有OS的硬件上运行,一个则不行。

vector

首先,模板类形式如下

template<
    class T,
    class Allocator = std::allocator<T>
> class vector; 
Enter fullscreen mode Exit fullscreen mode

//默认自带一个allocator
这里面有pmr这个vector,来自C++17.std::pmr::vector
对于在C++20后引入的,除capacity(),operator[],push_back(),pop_back,
size(),剩下的成员函数全部都支持constexpr。
对于constexpr,就是在编译时就确定了值的变量或函数,可以用于增加程序性能。
对于vector的object,是不支持constexpr的,因为涉及到动态分配内存。
对于vector,中的模版参数,必须是要一定支持拷贝构造函数和赋值运算符函数的。
同时,vector中的模版参数也必须满足Erasable要求,Erasable要求指的是类型可以被删除,比如int、string就可以,但是int*就不可以。
其中Allocator的value_type必须和vector中声明的模版参数一致。
Specializations:其中,如果T是bool,那么会被优化为用bitset来存。

迭代器失效
其中对vector中元素只读是不会失效的
对于swap和swapend,是指向end()的迭代器失效.
对于clear、operator=、assign、reverse全部失效。
对于reserve、shrink_to_fit,如果容量发生改变,则全部失效。

成员函数

1.assign和assign_range

vector<int> vec;
vec.assign(5,10);//分配5个10
//算了,assign_range是c++23的,不看也罢
Enter fullscreen mode Exit fullscreen mode

2.元素访问类的at、operator[]、front、back、data。

auto val = vec.at(0); /*访问下标为0的位置,主要特点是会进行边界检查,如果异常的话会抛出std::out_of_range异常*/

auto val = vec[0]; /*不会进行边界检查,如果超出边界行为是未定义的*/

auto val = vec.front(); /*访问第一个元素*/

auto val = vec.back(); /*访问最后一个元素*/

auto ptr = vec.data(); //返回一个指向首元素的裸指针
Enter fullscreen mode Exit fullscreen mode

3.四个迭代器,正向、常量正向、反向、反向常量
我们使用迭代器不是自己创建的,而是直接用一个变量来接收
end是实际元素的下一个位置

for(auto it = vec.begin();it != end();++it){
   cout << *it << endl;
}//不仅可以访问也可以修改

for(auto it = vec.cbegin();it != end();++it){
   cout << *it << endl;
}//不可以修改只可以访问

for(auto it = vec.rbegin();it != rend();++it){
   cout << *it << endl;
}//反向

for(auto it = vec.crbegin();it != rend();++it){
   cout << *it << endl;
}//不可以修改只可以访问
Enter fullscreen mode Exit fullscreen mode

4.容量相关函数

if(vec.empty()){
   cout << "vector is empty" << endl;
} //就是判空

cout << "vector size is " << vec.size() << endl;//判断的是有几个元素,不要与容量搞混

cout << "Max size" << vec.max_size() << endl;//可能容纳的最大值,通常是一个超级大的数值

vec.reserve(10); //为vec提供分配容量 如果目前是15,使用了这个容量保持不变

cout << "Capcity" << vec.capcity() << endl; //是容量

vec.reserve(100);
vec.shrink_to_fit(); //把未使用的容量清除,没有参数。
Enter fullscreen mode Exit fullscreen mode

Top comments (0)