IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++Primer——第九章:顺序容器 -> 正文阅读

[C++知识库]c++Primer——第九章:顺序容器

1、几个迭代器

begin、end、cbegin、cend、rbegin、rend、crbegin、crend

2、与顺序容器大小相关的构造函数

顺序容器(array除外)提供一个构造函数。它接受一个容器大小和一个(可选的)元素初始值,如果我们不提供元素的初始值,则标准库会创建一个值初始化器。如果元素类型是没有默认构造函数的类类型,则除了大小参数外,还必须指定一个显式的元素初始值。

3、标准库array

使用array必须同时指定元素类型和大小

	array<int, 3> arr;	//3个默认初始化的int
	array<int> arr1;	//错误  没有array<int>类型
	array<int, 3> arr2 = { 1,2,3 }; //列表初始化
	array<int, 3> arr3 = { 1 }; // 1,0,0

内置数组不能进行拷贝或对象赋值,但标准库array支持这种操作

	int a[3] = { 1,2,3 };
	int b[3] = a;		//错误 内置数组不支持拷贝或赋值
	array<int, 3> c = { 1,2,3 };
	array<int, 3> d = c; //正确

4、赋值和swap

赋值相关运算会导致指向左边容器内部的迭代器、引用、指针失效。而swap操作不会使他们失效。

5、assign

赋值运算符要求左右两边的运算对象具有相同的类型。顺序容器(除了array)还定义了一个名为assign的成员,允许我们从一个不同但相容的类型赋值,或者从一个容器的子序列赋值。assign也是拷贝

	list<string> sl;
	vector<const char*> cv;
	sl = cv;  // 错误 容器类型不匹配
	sl.assign(cv.begin(), cv.end()); //正确
	//也可以这样用
	sl.assign(10, "hi");

6、swap

swap操作交换两个相同类型的容器的内容。除array外,swap不对任何元素进行拷贝、删除或插入操作,因此可以保证在常数时间内完成。元素不会被移动的事实意味着除了string外,指向容器的迭代器、引用、指针在swap操作之后都不会失效,他们仍然指向swap交换前的元素,但是,着些元素已经属于不同的容器了。

7、emplace操作

emplace_fron、emplace、emplace_back是c++11新标准引入的成员,他们操作构造而不是拷贝元素。使用push或insert时是将元素类型的对象传递给它们,这些对象被拷贝到容器中,而调用emplace成员时,则是将参数传递给元素类型的构造函数

class A
{
public:
	A(int x, int y):a(x), b(y){}
	~A(){}

private:
	int a;
	int b;
};

void test()
{
	vector<A> vec;
	vec.emplace_back(1, 2);
	vec.push_back(A(1, 2));
}

10、访问元素

  • 包括array在内的每个顺序容器都有一个front成员函数
  • 除forward_list之外的所有顺序容器都有一个back成员函数
  • at和下标操作只适用于string、vector、deque和array

以上操作使用前都需要确保容器非空,它们都返回元素的引用。非const得情况下可以当左值使用。

11、下标操作和安全的随机访问

下标运算符并不检查下标是否在合法的范围内,使用越界的下标是一种严重的程序设计错误,编译器不检查这种错误。如果我们希望确保下标是合法的。可以使用at成员函数,使用at下标越界时会抛出out_of_range异常

	vector<int> vec;
	cout << vec[0] << endl; //运行时错误 vec中没元素
	cout << vec.at(0) << endl; // 抛出out_of_range异常

12、resize和reserve

    vector<int> ivec{ 5,3 };
	ivec.resize(10); //前5个3 后5个0
	cout << ivec.size() << " " << ivec.capacity() << endl;  // 10 10
	ivec.resize(3);	 //删除末尾的7个值  capacity不变
	cout << ivec.size() << " " << ivec.capacity() << endl;  // 3 10
	ivec.reserve(1);
	cout << ivec.size() << " " << ivec.capacity() << endl;  // 3 10
	ivec.reserve(8);
	cout << ivec.size() << " " << ivec.capacity() << endl;  // 3 10
	ivec.erase(ivec.begin());
	cout << ivec.size() << " " << ivec.capacity() << endl;  // 2 10
	ivec.shrink_to_fit();
	cout << ivec.size() << " " << ivec.capacity() << endl;  // 2 2

shrink_to_fit也只是个请求,标准库并不保证一定退还内存

13、string的诸多操作

14、容器适配器

标准库定义了三个顺序容器适配器:stack、queue和priority_queue

一个容器适配器接受一种已有的容器类型。使其行为看起来像一种不同的类型

默认情况下stack和queue是deque实现的,priority_queue是在vector上实现的。我们可以在创建一个适配器时将一个命名的顺序容器作为第二个类型参数来重载默认容器类型

	stack<string, vector<string>> str_stk; //在vector上实现的空栈
	stack<string, vector<string>> str_stk2(svec); //在vector上实现的栈,初始化时保存svec的拷贝

stack只要求push_back、pop_back、back操作,因此可以使用除array和forward_list外的任何容器类型来构造。queue要求back、push_back、front、push_front,因此可以构造与list或dqueu之上,但不能基于vector构造。priority_queue除了front、push_back、pop_back外还要求随机访问能力,因此可以用vector和deque构造,不能用list

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-27 16:01:53  更:2021-07-27 16:02:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/2 6:26:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码