C++ Primer(一)_标准库_顺序容器

目录

  • 顺序容器

顺序容器

选择什么容器根据业务需求, 研读STL剖析了解底层数据结构, 更加清楚各种优势劣势

零碎点

  • 迭代器被设置为左闭右合带来的编程假设

    • begin == end,范围为空
    • begin != end, 至少一个元素
    • begin可递增至end
  • 两大类型的容器初始化——同类型容器拷贝,迭代器范围拷贝
    • 前者要求容器类型一致
    • 后者只要求元素可转换
  • 两大类型的容器赋值——=号赋值,assign赋值
    • 前者用于列表或同类型容器
    • 后者用于迭代器,初始化列表,(n,elem)方式;限制顺序容器
  • swap交换容器内容

    除Array,其他容器只是交换数据结构,不涉及元素拷贝插入删除,常数时间

    • 失效内容:除了string容器,其他的都不失效,但是已经转换了容器,而Array则是转换了值
  • 容器之比较——任何容器都支持== !=;除无序关联(unordered的关联容器)外,其他都支持< > <= ……各种比较

    容器的== !=由元素的==实现;其他由<实现;

    然而<也足以推断==情况(交换位置多比一次即可)

顺序容器的操作

失效操作请剖析STL

以下增删改查针对绝大多数顺序容器

  • 增——拷贝

    emplace区别主要是可用提供初始化器而非元素对象

    front_list有自己的insert和emplace,只支持下面的front型操作
    .push_back(t)
    .emplace_back(args) args是可用以来初始化元素的东西
    .push_front(t) vecotr和string不支持,费时
    .emplace_front(args) vecotr和string不支持
    .insert(p, t) 这个及以下的都返回插入元素的迭代器
    .emplace(p, args)
    .insert(p, n, t) n个t
    .insert(p, b, e) 迭代器范围
    .insert(p, il) il,初始化列表
  • 查(访问)——引用访问
空或越界除了at外,都未定义
.back()
.front()
[] 和at只能用于vec,str,deque,arr
.at() 下标越界,返回out_of_range
不检查合法性
.pop_back() f_l不支持
.pop_front() vec, str不支持
.erase(p) 迭代器
.erase(b, e) 范围
.clear() 清空
  • 改变大小
.resize(n)
.resize(n, t) 若为增大,新元素初始化为t
  • 容量操作——vector,string,deque
deque不支持后两个
.shrink_to_fit() capacity减小到size
.capacity()
.reserve(n) 小于等于当前什么都不做

强制释放或缩小vector内容

// 强制释放
vector<int> vec;
{
    vector<int>().swap(vec);
}

// 强制缩小
vector<int> vec;
swap(vector<int>(vec), vec);

迭代器失效情况 // TODO底层?

指针、迭代器、引用,失效指不再表示任何元素

    • vector和string,

      • 内存重分配——全部失效
      • 未重分配——插入位置后的全失效
    • deque
      • 非首尾——全部失效
      • 首尾——迭代器失效,其他有效
    • list和forward_list,全都有效
    • vector和string

      • 被删除点后全部失效
    • deque
      • 非首尾——全部失效
      • 首尾——首迭代器或尾迭代器失效
    • list和forward_list,除删除点全都有效

特立独行者——front_list

它是单向链表,获取前驱比较麻烦

.before_begin() 表头前不存在的元素,不可解引用
.insert_after(p, t) 返回最后一个插入的元素的迭代器
.insert_after(p, n, t)
.insert_after(p, b, e)
.insert_after(p, il)
.emplace_after(p, args)
.erase_after(p) 返回被删除元素的后一个元素的迭代器
.erase_after(b, e)

string的额外操作

  • 构造的其他方法
string s(cp, n) cp是字符数组指针
string s(str2, pos2) str2是已存在string
string s(s2, pos2, len2)
  • s.substr(pos, n) // 返回子串
  • 修改
.insert(pos, args) pos可以是下标,返回引用;可以是迭代器,返回迭代器
.erase(pos, len) len省略删完,返回引用
.assign(args) 返回引用
.append(args) 返回引用
.replace(range, args) range可以是pos,n(下标长度)或者b,e(迭代器),返回引用
  • 搜索
找到返回下标,没有就string::npos(一个string::size_type值,-1,但是因为无符号,所以是最大值)
.find(args) 第一次出现位置
.rfind(args) 最后一次出现位置
.find_first_of(args) args中任意字符第一次出现
.find_last_of(args)
.find_first_not_of(args) 第一个不再args中的字符
.find_last_not_of(args)
  • 比较.compare

    参数格式;返回值:0等于 >0大于 <0小于 n表示长度
    s2
    pos1, n1, s2
    pos1, n1, s2, pos2, n2
    cp
    pos1, n1, s2
    pos1, n1, cp, n2
  • 数制转换
to_string(val)
stoi(s, p, b) 后面都一样,s字符串,p是size_t指针,保存第一个非数字内容的下标
stol b是转换基数
stoul 整型不识别e
stoll
stoull
stof(s, p) 识别e
stod
stold

适配器操作

  • 通用操作
.empty()
.size()
.swap()
swap(a, b)
  • stack——默认基于deque,可用list或vector,用模板第二个参数修改
.pop() 删除而不返回
.push(item)
.emplace(args)
.top() 可修改
  • queue——基于deque,可list或vector
.front() 可修改
.back()
.pop()
.push(t)
.emplace(args)
  • priority_queue——基于vector,可deque
.pop()
.top() 不能修改
.push()
.emplace()

原文地址:https://www.cnblogs.com/YanceW/p/11695611.html

时间: 2024-10-10 14:51:02

C++ Primer(一)_标准库_顺序容器的相关文章

C++primer笔记:IO库、顺序容器、关联容器、面向对象、泛型算法、模板和泛型编程

第八章:IO库不直接来处理输入输出,而是通过在标准库中的一些类型来处理io istream ostream cin cout cerr getline函数 iostream:定义了用于基本读写流的基本类型 fstream: 定义了基本的读写命名文件的类型 sstream:定义了读写内存的string对象的类型 IO对象无拷贝或者赋值 条件状态:IO定义了一些函数和标志,可以帮助我们访问和操作流得条件状态 strm::iostate 条件状态的完整功能 strm::badbit 流已崩溃 strm

C++标准库之顺序容器

通用概念. 顺序容器基本理解:按照顺序储存元素,并提供 元素具体操作(迭代器或其他) 和 顺序访问元素 的能力. 个人理解: 1)顺序:按照添加的先后次序排序.但,先进优先,还是后进优先取决于具体容器. 个人应用: 1)在可以使用容器时,尽量使用容器.因为你无法保证自己的算法优于整个开发组. 2)选择容器的基本原则(from C+ primer): 1,在不知道如何选择时,使用vector. 2,单个元素需求内存很小,内存紧缺时,不要使用list/forward_list. 3,已知添加操作时,

C++ Primer笔记1_转义字符_标准库类型string_标准库类型vector

1.转义字符 一般有两种方式: \x后紧跟1个或多个十六进制数字.或\后紧跟1.2.3个八进制数字,当中数字部分是字符相应的数值. #include <iostream> using namespace std; int main() { bool b = 10; bool b1 = true; bool b2 = false; cout << b << endl; cout << b1 << endl; cout << b2 <

[C/C++标准库]_[优先队列priority_queue的使用]

std::priority_queue 场景: 1. 对于一个任务队列,任务的优先级由任务的priority属性指明,这时候就需要优先级越高的先执行.而queue并没有排序功能,这时priority_queue是比较好的选择. 2 对于异步的task也是一样,在不断添加新的task时,当然希望优先级越高的先执行. 解析: 1. 如果需要把优先级最高的先pop,那么comp比较时需要返回false. 代码: //1.Elements are popped from the "back"

[C/C++标准库]_[读写中文路径的文件--写入unicode字符串]

场景: 1. 需要写入非ascii文本并且与本地编码无关时,除了utf8,unicode编码是另外一个选择,它的好处是占两个字节,便于统计字符和对字符进行处理,因为有对应的宽字节的函数,如wcslen. 2.需要注意的亮点,要先写入0xff,0xfe文件头,之后使用fwprintf时用%S(大写)格式写入宽字节字符串. 3.使用_wfopen支持中文路径. 代码1: #include <stdio.h> #include <stdint.h> #include <stdlib

C++自学笔记_标准库类型_《C++ Primer》

1.标准库string类型 1.1 string对象的定义和初始化 string s1; //默认构造函数,s1为空串 string s2(s1); //将s2初始化为s1的一个副本 string s3("value"); //将s3初始化为一个字符串字面值副本 string s4(n,'c'); //将s4初始化为字符'c'的n个副本 1.2 string对象的读写 int main(){ string s; cin>>s; cout<<s<<en

[C/C++标准库]_[初级]_[交集和补集]

场景: 1. 计算std::vector A和 std::vector B里的相同的元素, 用于保留不删除. 2. 计算std::vector A和 std::vector B里各自的补集, 用于删除A的补集和添加B的补集,用在一些更新关联表的操作里. 比如联系人A所属分组B是一个集合BV, 把联系人A的所属分组 修改为集合CV, 就需要删除两个集合BV,CV的CV补集和新增BV补集. 3. C++标准库为我们提供了这些算法. 代码: // test_AndroidAssistant.cpp :

[C/C++标准库]_[初级]_[使用ctype里的isxxx函数时要注意的事项]

场景: 1. 标准库里的 ctype.h里的函数是用于1个字节的判断的,但是参数却是int, 这样很容易导致误用. isalpha iscntrl isdigit isgraph isprint ispunct isspace isxdigit isalnum islower isupper int isspace( int ch ); 最恶心的是vc++的实现会对超过1字节的值会直接崩溃,gcc不会!!! #if defined (_DEBUG) extern "C" int __c

[C/C++标准库]_[初级]_[使用模板删除字符串前后空格((w)string space)]

场景: 1. C++没有提供删除std::(w)string的前后空格的函数,比如TrimSpace. 2. 很多库都提供, 但是为了移植代码方便,最好还是能用标准库解决就用标准库. 下边用模板实现了移除空格的函数. test.cpp #include <iostream> #include <stdlib.h> #include <string.h> #include <string> #include <ctype.h> using name