(二) 序列容器

(二) 序列容器,第1张

(二) 序列容器

1、序列式容器是什么?

序列容器以线性序列的方式存储元素。它没有对元素进行排序,元素的顺序和存储它们的顺序相同。

array(数组容器)是一个长度固定的序列,有N个T类型的对象,不能增加或删除元素

vector(向量容器)是一个长度可变的序列,用来存放T类型的对象。必要时,可以自动增加容量,但只能在序列的末尾高效地增加或删除元素。

deque(双向队列容器)是一个长度可变的,可以自动增长的序列,在序列的两端都不能高效地增加或删除元素。

list(链表容器)是一个长度可变的、由T类型对象组成的序列,它以双向链表的形式组织元素,在序列的任何地方都可以高效地增加或删除元素。访问容器中任意元素的速度要比前三种容器慢。

forward list(正向链表容器)是一个长度可变的、由T类型对象组成的序列,它以单链表的形式组织元素,是一类比链表容器快、更节省内存的容器,但是它内部的元素只能从第一个元素开始访问。

 array、vector和deque容器的函数成员

函数成员

array

vector

deque

begin() - 返回幵始迭代器

end() - 返回结束迭代器

rbegin() - 返回反向'开始迭代器

rend() - 返回反向结束迭代器

cbegin() - 返M const开始迭代器

cend() - 返回const结束迭代器

crbegin() - 返回const反向开始迭代器

crend() - 返回const反向结束迭代器

assign() - 用新元素替换原有内容

-

operator=() - 复制同类型容器的元素,或者用初始化列表替换现有内容

size() - 返回实际元素个数

max_size() - 返回元素个数的设大值

capacity() - 返回当前容量

-

-

empty() - 返回true,如果容器中没有元素的话

resize() - 改变实际元素的个数

-

shrink _to_fit() - 将内存减少到等于当前元素实际所使用的大小

-

front() - 返回第一个元素的引用

back() - 返回铖后一个元素的引用

operator[]() - 使用索引访问元素

at() - 使用经过边界检査的索引访问元素

push_back() - 在序列的尾部添加一个元素

-

insert() - 在指定的位置插入一个或多个元素

-

emplace() - 在指定的位置直接生成一个元素

-

emplace_back() - 在序列尾部生成一个元素

-

pop_back() - 移出序列尾部的元素

-

erase() - 移出一个元素或一段元素

-

clear() - 移出所苻的元素,容器大小变为 0

-

swap() - 交换两个容器的所有元素

data() - 返回包含元素的内部数组的指针

-

list 和 forward_list 的函数成员

函数成员

list

forward list

begin() - 返回开始迭代器

end() - 返回结束迭代器

rbegin() - 返回反向开始迭代器

-

rend() - 返回反向结束迭代器

-

cbegin() - 返回 const 开始结束迭代器

before_begin() - 返回一个指向第一个元素前一个位置的迭代器

-

cbefore_begin() - 返回一个指向第一个元素前一个位置的const迭代器

-

cend() - 返回 const 结束迭代器

crbegin() - 返回 const 反向开始迭代器

-

crend() - 返回 const 反向结束迭代器

-

assign() - 用新元素替换原有内容

operator=() - 复制同类型容器的元素,或者用初始化列表替换现有内容

size() - 返回实际元素个数

-

max_size() - 返回元素个数的最大值

resize() - 改变实际元素的个数

empty() - 返回 true,如果容器中没有元素的话

front() - 返回第一个元素的引用

back() - 返回最后一个元素的引用

-

push_back() - 在序列的潘部添加一个元素

-

push_front() - 在序列的起始位置添加一个元素

emplace() - 在指矩位置直接生成一个元素

-

emplace_after() - 在指定位置的后面直接生成一个元素

-

emplace_back() - 在序列尾部生成一个元素

-

cmplacc_front() - 在序列的起始位生成一个元索

insert() - 在指定的位置插入一个或多个元素

-

insert_after() - 在指定位置的后面插入一个或多个元素

-

pop_back() - 移除序列尾部的元素

-

pop_front() - 移除序列头部的元素

reverse()-反向元素的顺序

erase() - 移除指定位置的一个元素或一段元素

-

erase_after() - 移除指定位 1;后面的一个元素或一段元素

-

remove() - 移除所符和参数匹配的元素

remove_if() - 移除满足一元函数条件的所有元素

unique() - 移除所有连续重复的元素

clear() - 移除所有的元素,容器大小变为 0

swap() - 交换两个容器的所有元素

sort() - 对元素进行排序

merge() - 合并两个有序容器

splice() - 移动指定位置前面的所有元素到另一个同类型的 list 中

-

splice_after() - 移动指定位置后面的所有元素到另一个同类型的 list 中

-

2、array的用法及初始化

array模板定义了一种相当于标准数组的容器类型,T为类型,N为个数。头文件array

std::array data;

如果定义了一个array容器,却没有为元素指定初始值,那么元素就不会被初始化,将它们初始化为0或者和默认元素类型等效的值:

std::array data {};

使用该语句初始化后,容器中所有的元素都会变为0.形参N必须是一个常量表达式并且容器中元素的个数不能变。当创建array容器的实例时,要像创建常规数组,对元素进行初始化:

std::array values {0.5,1.0,1.5,2.0};

初始化器列表中的4个值用于初始化前4个元素,其余的元素都将为0.

通过调用数组对象的成员函数fill(),可以将所有元素设成给定值。values.fill(3.14)

3、vector

(1) vector的使用、创建及初始化

std::vector values;

容器中没有元素,所以没有分配空间,当添加第一个数据项时,会自动分配内存,调用reserve()来增加容器的容量:

可以用元素类印相同的容器来初始化vector容器。用一对迭代器来指定初始值的范围。

std::array words{‘one’,’two’,’three’,’four’,’five’};
std::vector words_copy {std::begin(words),std::end(words)};

words_copy被words数组容器中的元素初始化。如果使用移动迭代器指定words_copy的初始化范围,words中元素将会从words移到words_copy.

std::vector words_copy{std::make_move_iterator(std::begin(words)),
std::make_move_iterator(std::end(word))}

words_copy会像前面那样被初始化。但元素是移动过来的而不是复制过来的,words数组中的字符串现在都是空字符串。

(2) vector获取元素

可以在方括号中使用索引,为现有元素设定值,或者只是通过表达式使用它的值。

std::vector values(20);
values[0]=3.14159;
values[1]=5.0;

vector的成员函数front()和back()分别返回序列中第一个和最后一个元素的引用:

std::cout< 

因为成员函数front()和back()返回的是引用,所以它们可以出现在赋值运算符的左边。

values.front()=2.71828;

成员函数data()返回一个指向数组的指针,它在内部被用来存储元素。

auto pData=values.data();

pData是double*类型,一般来说,data()返回vector容器的T*类型的值。必要时可以使用这个函数。

(3) vector添加(增加)元素

向容器中添加元素的唯一方式是使用它的成员函数。如果不调用成员函数,非成员函数既不能添加也不能删除元素。

push_back()使用右值引用参数,就可以通过移动运算来添加元素。

std::vector words;
words.push_back(“adiabaticft”);
words.emplace_back(“adiabaticft”);  //比push_back更有效率,调用string的构造函数并且创建元素

(4) vector插入元素

emplace()的第一个参数是一个迭代器,确定对象生成的位置。对象会被插入到迭代器所指定元素的后面。第一个参数后的参数,都作为插入元素的构造函数的参数传入。

std::vector words{“first”,”second”};
auto iter=words.emplace(++std::begin(words),5,’A’);
words.emplace(++iter,”$$$”);

在emplace()的第一个参数的后面,可以使用尽可能多的参数,只要它们是被插入对象的构造函数所需要的。在上面的代码片段中,第一次调用emplace()会得到一个由构造函数string(5,’A’)生成的字符串对象。

(5) vector删除元素

只能通过容器的成员函数来删除元素。通过使用vector的成员函数clear()来删除所有的元素。

std::vector data(100,99);                 //100个int型元素的vector对象,初始值99
data.clear();                                 //清除容量
data.pop_back();                             //删除容器尾部的元素
std::swap(std::begin(data)+1,std::end(data)-1);     //用来交换两个vector容器中的元素
data.shrink_to_fit();                  //不再向容器中添加新元素,去掉容器中多余的容量
auto iter=data.erase(std::begin(data)+1);          //erase()来删除容器中的一个或多个元素
auto iter=data.erase(std::begin(data)+1,std::begin(data)+3); //用来指定移除元素的范围
#remove()算法由定义在algorithm头文件中的模板生成,删除匹配特征值的一段元素。
std::vector words {“one”,”none”,”some”,”all”,”none”,”most”,”many”};
auto iter=std::remove(std::begin(words),std::end(words),”none”);

 如果在remove() *** 作后输出words中元素,只会输出前5个元素。尽管size()返回的值任然是7,而且最后两个元素存在,但是它们被替换成空字符串对象。为了摆脱多余的元素,可以使用成员函数erase().

words.erase(iter,std::end(words));

(6) deque使用、创建及初始化详解

deque,一个定义在deque头文件中的容器模板,可以生成包含T类型元素的容器,它以双端队列的形式组织元素。可以在容器的头部和尾部高效地添加或删除对象,这是它相对于vector容器的优势。

生成deque容器

如果用默认的构造函数生成deque容器,容器中没有任何元素,

std::deque a_deque; //队列没有元素

可以生产给定元素个数的deque容器:

std::deque my_deque(10); //队列有10个元素

 

deque添加和删除元素方法

deque和vector都有成员函数push_back()和pop_back(),在序列尾部添加或删除元素的方式相同。deque也有成员函数push_front()和pop_front(),可以在序列头部执行相似的 *** 作。

std::deque number {2,3,4};
number.push_front(11);  //numbers contains 11 2 3 4
number.push_back(12);  //numbers contains 11 2 3 4 12
number.pop_front();    //numbers contains 2 3 4 12

除了和vector一样都有emplace_back()函数外,deque还有成员函数emplace_front(),可以在序列的开始位置生成新的元素。和vector一样,也可以使用emplace()或insert()在deque内部添加或移除元素。

deque修改(替换、更改)元素详解

deque的成员函数assign()可以替换现有的所有元素。使用初始化列表来替换deque容器中内容:

std::deque words{“one”,”two”,”three”,”four”};
auto init_list={string(“seven”),string(“eight”),string(“nine”)};
words.assign(init_list);

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5715154.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存