首页 > 编程语言 >C++ STL

C++ STL

时间:2023-08-03 18:56:41浏览次数:32  
标签:容器 cout STL C++ ++ value push buf

1.初始

  • 头文件
    c++标准库不包括.h,#include;c旧库需要包括.h,#include<stdio.h>;c新库在旧库前面加c,不需要包含.h,#include
    旧头文件不被封装在std命名空间中。

  • 网站资源
    www.cplusplus.com
    cppreference.com
    gcc.gnu.org

  • 书籍

2.STL体系结构

  • 部件
    六大部件:容器、分配器、迭代器、适配器、算法、仿函式
    容器用于管理内存。
    分配器用于支持容器的内存管理。
    除了容器模板类本身的操作之外,其他操作被独立出来作为算法;可见则不是面向对象编程,而是模板编程。
    迭代器是泛化的指针,用于协助算法操作容器。
    仿函数用于对类进行函数操作。
    适配器可以转换容器、仿函数、迭代器。
  • 复杂度
    没有一种容器或者算法是最优的,而是根据需求选择。
  • 前闭后开区间
    begin()指向第一个元素,end()指向最后一个元素的下一个位置。无论是否是连续容器。因此,遍历容器可以:
Container<T> c;
...
Container<T>::iterator ite = c.begin();
for(;ite!=c.end();++ite)
...

除此之外,可以使用范围for循环。其中遍历对象是迭代器。

std::vector<int> vec;
...
for(auto elem:vec){ std::cout<<elem<<std::endl; }
for(auto& elem:vec){ elem*=2; }

3.容器分类与结构

序列容器、关联容器(key-value,适合快速查找)、不定序容器(一种关联容器,使用hash table实现)

序列容器

  • array
    将array包装成了class,无法扩充。
array<long,Asize>c;
for(long i=0;i!=Asize;++i) c[i]=rand();
coud<<c.size()<<" "<<c.front()<<" "<<c.back()<<" "<<c.data();//尺寸、第一个元素、最后一个元素、地址
qsort(c.data(),Asize,sizeof(long),compareLongs);
long* pItem = (long*)bsearch(&tarhet,(c.data(),Asize,sizeof(long)));
  • vector
    可以向后扩展与删除。
vector<string>c;
char buf[10];
for(long i=0;i!=value;++i)
{
  try{
    c.push_back(string(buf));
  }
  catch(exception& p)
  {
    abort();//退出程序
  }
}
cout<<c.size()<<" "<<c.front()<<" "<<c.back()<<" "<<c.data()<<" "<<c.capacity();
auto pItem = ::find(c.begin(),c.end(),target);cout<<*pItem;
sort(c.begin(),c.end());
string* pItem = (string*)bsearch(&target,(c.data()),c.size(),sizeof(string));
  • list
    不连续空间,使用指针的双向环状链表。
list<string>c;
char buf[10];
for(long i=0;i!=value;++i)
{
   try{
    c.push_back(string(buf));
  }
  catch(exception& p)
  {
    abort();//退出程序
  }
}
cout<<c.size()<<" "<<c.front()<<" "<<c.back()<<" "<<c.max_size();
auto pItem = ::find(c.begin(),c.end(),target);
c.sort();//当容器自身提供sort时要比全局sort更快。
  • forward-list
    不连续空间,使用指针的单向链表。考虑到指针空间,单向链表比双向链表更节省内存。
forward_list<string>c;
char buf[10];
for(long i=0;i!=value;++i)
{
   try{
    c.push_front(string(buf));//需要使用push_front(),而非push_back()
  }
  catch(exception& p)
  {
    abort();//退出程序
  }
}
cout<<c.front()<<" "<<c.max_size();//没有back、size
auto pItem = ::find(c.begin(),c.end(),target);
c.sort();//当容器自身提供sort时要比全局sort更快。
  • slist
#include<ext\slist>
__gnu_cxx::slist<string>c;
char buf[10];
for(long i=0;i!=value;++i)
{
   try{
    c.push_front(string(buf));//需要使用push_front(),而非push_back()
  }
  catch(exception& p)
  {
    abort();//退出程序
  }
}
cout<<c.front()<<" "<<c.max_size();//没有back、size
auto pItem = ::find(c.begin(),c.end(),target);
c.sort();//当容器自身提供sort时要比全局sort更快。
  • deque
    两端可进可出。
    分段连续,段内部连续,段间不连续,操作符重载++使得使用者感觉是连续的。如果空间不够,当push_back,会在后面分配新的buffer,当push_front,会在前面分配新的buffer。因为是以buffer分配的,所以会比vector按倍数分配更节省空间,当然比list、forward_list、slist占用空间更多,但是查找效率更高。
deque<string>c;
char buf[10];
for(long i=0;i!=value;++i)
{
  try{
    c.push_back(string(buf));
  }
  catch(exception& p)
  {
    abort();//退出程序
  }
}
cout<<c.size()<<" "<<c.front()<<" "<<c.back()<<" "<<c.max_size();
auto pItem = ::find(c.begin(),c.end(),target);cout<<*pItem;
::sort(c.begin(),c.end());
  • stack
    先进先出。使用deque实现。可以看作容器的adapter。
stack<string>c;
char buf[10];
for(long i=0;i!=value;++i)
{
  try{
    c.push(string(buf));
  }
  catch(exception& p)
  {
    abort();//退出程序
  }
}
cout<<c.size()<<" "<<c.top()<<" "<<c.back();
c.pop();
  • queue
    先进先出。使用deque实现。可以看作容器的adapter。
queue<string>c;
char buf[10];
for(long i=0;i!=value;++i)
{
  try{
    c.push(string(buf));
  }
  catch(exception& p)
  {
    abort();//退出程序
  }
}
cout<<c.size()<<" "<<c.front()<<" "<<c.back()<<" "<<c.back();
c.pop();

关联容器

使用红黑树实现。

  • set/multiset
    key就是value;multiset表示key可重复。
  • map/multimap
    每个节点有key和value;multimap表示key可重复。

不定序容器

使用hash table实现。根据计算来决定元素放在表中的位置,如果发生碰撞则分开放,但是不够理想,而是以链表保存碰撞的元素。如果碰撞次数太多,链表就会很长,查找效率很低,此时会重新打散。

标签:容器,cout,STL,C++,++,value,push,buf
From: https://www.cnblogs.com/etherovo/p/17603860.html

相关文章

  • C++ | extern "C" 的用法
    extern"C"是C++中的一种用法(无法在C语言中使用),其作用是修饰一段代码,将其用C语言的方式进行编译。那么,使用C语言方式进行编译与使用C++方式进行编译又有什么区别呢?在C++中,支持函数重载:voidfunc();voidfunc(inta,intb);voidfunc(doublea,floatb);但在C语言中如果......
  • C++基础
    Talkischeap.Showmethecode.C++分为C++语言和C++标准库 版本演化可分为C++98(1.0),C++11(2.0),C++14话不多说,上代码头文件命名方式,例如complex.h首先要写防卫式声明,以前写的时候只是知道要写,现在知道才叫什么。1#ifndef_MYCOMPLEX_2#define_MYCOMPLEX_34......
  • Linux平台C++读写Word文档(DuckX库)
    1、安装cmake如果没有cmake或者cmake版本太旧,都需要进行重新安装此次推荐直接安装编译好的软件包进入官网:https://cmake.org/download/下载后直接在拷贝到系统里进行解压添加环境变量vim/etc/profile添加下面这条命令,路径换成自己安装的路径exportPATH=$PATH:/root......
  • c++
    1,2章输出printf(    输入scanf(一,变量通用形式<类型名><变量名>变量名=标识符(不能用数字开头,不能用关键字/保留字)前缀const【不变的】即锁定变量值(不允许改变)若变量要作为赋值则变量初始时要赋值(初始化) eg:inta; =》inta=0;二,浮点数类型名:int整点   do......
  • 遵守 MISRA 如何提高C++应用的安全性
    Perforce在支持需要稳定和安全的应用程序方面有着悠久的历史。凭借50多年的应用程序开发经验,从客户、趋势和竞争对手那里学到了很多东西。Perforce从软件开发的所有领域都采用了最佳实践,并试图将这些实践应用于Perforce所做的一切。Perforce采用了单元测试、自动化测试、敏捷开......
  • 老杜 JavaWeb 讲解(十八) ——项目优化(Servlet+JSP+EL+JSTL)
    (十六)项目优化(Servlet+JSP+EL+JSTL)相关视频:55-EL表达式JSTL和base标签改造OA新旧代码对比:注意点:Java代码不需要改动,只需要更改jsp代码。将需要的包导入:jakarta.servlet.jsp.jstl-2.0.0.jarjakarta.servlet.jsp.jstl-api-2.0.0.jarmysql-connector-j-8.0.31.j......
  • C/C++ 数据结构五大核心算法之动态规划算法-给你一根长度为 n 的金条,请把金条剪成 m
    动态规划也是一种分治思想,但与分治算法不同的是,分治算法是把原问题分解为若干子问题,自顶向下,求解各子问题,合并子问题的解从而得到原问题的解。动态规划也是自顶向下把原问题分解为若干子问题,不同的是,然后自底向上,先求解最小的子问题,把结果存储在表格中,在求解大的子问题时,直接从表......
  • 常用c++ STL 汇总
    常用STL:vector变长数组,倍增的思想初始化://初始化vector<int>a;vector<int>a(n);vector<int>a[n];vector<int>a(n,0);//长度为n,值为0操作:size()//返回元素个数empty()//返回是否为空clear()//清空front()/back()//返回第一个/最后一个元素push_bac......
  • C++11可变模版参数妙用
    //参考:https://blog.csdn.net/wmy19890322/article/details/121427697点击查看代码//创建对象template<typenameT,typename...Args>T*CreateInstance(Args...args){ returnnewT(std::forward<Args>(args)...);}//可变参数模版实现泛化的delegatetemplate<typena......
  • C++入门到放弃(07)——构造函数和析构函数
    ​1.构造函数和析构函数是什么1.1构造函数通常一个类,其内部包含有变量和函数,当我们想要使用类的时候,总是会不得不面临这样一个问题,需要对类进行初始化,否则内部这些变量就会是随机值,导致程序出现异常。为此,我们需要在使用类之前对它进行初始化,C++就提供了这样一类特殊的函数——......