序列容器和容器适配器

序列容器

array<T,N> vector List
deque foward_list

常用函数接口 array,deque,vector。

函数成员 函数功能 array<T,N> vector deque
begin() 返回指向容器中第一个元素的迭代器。
end() 返回指向容器最后一个元素所在位置后一个位置的迭代器,通常和 begin() 结合使用。
operator=() 复制同类型容器的元素,或者用初始化列表替换现有内容。
size() 返回实际元素个数。
capacity() 返回当前容量。 - -
empty() 判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。
front() 返回第一个元素的引用。
back() 返回最后一个元素的引用。
operator 使用索引访问元素。
at() 使用经过边界检査的索引访问元素。
push_back() 在序列的尾部添加一个元素。 -
insert() 在指定的位置插入一个或多个元素。 -
pop_back() 移出序列尾部的元素。 -
erase() 移出一个元素或一段元素。 -
clear() 移出所有的元素,容器大小变为 0。 -
swap() 交换两个容器的所有元素。
data() 返回指向容器中第一个元素的[指针] -

List和foward_list

list 和 forward_list 容器彼此非常相似,forward_list 中包含了 list 的大部分成员函数,而未包含那些需要反向遍历的函数

函数成员 函数功能 list forward_list
begin() 返回指向容器中第一个元素的迭代器。
end() 返回指向容器最后一个元素所在位置后一个位置的迭代器。
rbegin() 返回指向最后一个元素的迭代器。 -
rend() 返回指向第一个元素所在位置前一个位置的迭代器。 -
assign() 用新元素替换原有内容。
operator=() 复制同类型容器的元素,或者用初始化列表替换现有内容。
size() 返回实际元素个数。 -
empty() 判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。
front() 返回容器中第一个元素的引用。
back() 返回容器中最后一个元素的引用。 -
push_back() 在序列的尾部添加一个元素。 -
push_front() 在序列的起始位置添加一个元素。
insert() 在指定的位置插入一个或多个元素。 -
insert_after() 在指定位置的后面插入一个或多个元素。 -
pop_back() 移除序列尾部的元素。 -
pop_front() 移除序列头部的元素。
reverse() 反转容器中某一段的元素。
erase() 移除指定位置的一个元素或一段元素。 -
erase_after() 移除指定位置后面的一个元素或一段元素。 -
remove() 移除所有和参数匹配的元素。
remove_if() 移除满足一元函数条件的所有元素。
unique() 移除所有连续重复的元素。
clear() 移除所有的元素,容器大小变为 0。
sort() 对元素进行排序。
merge() 合并两个有序容器。
splice() 移动指定位置前面的所有元素到另一个同类型的 list 中。 -
splice_after() 移动指定位置后面的所有元素到另一个同类型的 list 中。 -

数组

声明和初始化

#include<array>

std::array<double, 10> data {};//默认初始化为0
std::array<souble, 10>data {1,2,3};//前三个元素初始化为对应值,其余为0
data.fill(1)//所有元素初始化为对应值

容器数组作为参数传递时,可以不用传递大小,二通过size()函数获取

double sum {};
for(size_t i{0};i<data.size();++i)
{
	sum+=data[i];
}

Vector

创建和初始化

//声明
#include<string>
#include<vector>
uisng namespace std;

vector<string> data;//没有分配内存空间
//这是一个好习惯,声明时先指定一个大小,避免重复分配内存,此时初始化为0
vector<string> data(20);
声明时先指定一个大小,避免重复分配内存,此时初始化为val
vector<string> data(20,val);

vector<string> words {"one", "two","three", "four", "five"};

//迭代器来初始化
std::array<std :: string, 5> words {"one", "two","three", "four", "five"};
std::vector<std::string> words_copy {std::begin(words) , std::end(words)};

末尾插入元素对比

emplace_back()和push_back()

emplace_back()是c11引入的新特性,避免了临时对象的创建和销毁,浪费资源。//emplace_back() 的参数正是添加到容器中的对象的构造函数所需要的参数,故而能直接在容器中创建对象,而push_back需要先创建临时对象,再移动到容器中,如果对象类没有右值拷贝构造和右值移动赋值函数,将会增加临时对象的创建和销毁的资源浪费

参卡: https://blog.csdn.net/xiaolewennofollow/article/details/52559364

举例:

std::vector<std::string> words;
words.push_back (std:: string ("facetious") ) ; // Calls string constructor & moves the string object
words•emplace_back("abstemious");// Calls string constructor to create element in place

emplace()和insert()

区别同上一对的关系,emplace()是c11引入的新特性。

auto iter = words.emplace(++std::begin(words),5,'A');//指定位置插入五个A
auto iter = words.insert(++std::begin(words), "two");//指定位置插入TWO,位置使用迭代器。

insert还有很多种用法。

删除元素

clear()

删除所有元素,并初始化空间为0

删除元素只会改变size不会改变capacity

vector<int> a(100, 90);
a.clear();
cout << a.size() << endl;
cout << a.capacity() << endl;

out:
0
100

pop_back()

删除末尾元素

删除元素只会改变size不会改变capacity

data.pop_back()

如果不考虑顺序,如下步骤可以删除指定位置的元素

#include<algorithm>
std::swap(std::begin(data)+1,std::end(data)-1);//交换指定位置(第二个)的元素和最后一个元素
data.pop_back()

模板函数 swap(),它在头文件 algorithm 和 utility 中都有定义。这个函数将第二个元素和最后一个元素互相交换,区分vector成员函数swap是交换两个人相同类型容器。

shrink_to_fit()

去掉容器中多余的容量

删除元素不仅改变size,还会改变capacity

vector<int> data(10,1);
data.pop_back();
data.shrink_to_fit();
cout << data.size() << endl;
cout << data.capacity() << endl;

out:
9
9

erase()

1 删除指定位置的元素

只改变size,不改变capability;

auto iter = data.erase(std::begin(data)+1); //Delete the second element

2 删除指定范围的元素

左闭右开

// Delete the 2nd and 3rd elements
auto iter = data.erase(std::begin(data)+1,std::begin(data)+3);//删除2,3,

返回值iter,如果删除最后一个元素,iter== std::end(data) ,否则指向删除元素之后的下一个位置

begin end
1 2 3 4 5

删除2和3,之后

begin iter end
1 4 5

栈stack

创建和初始化

//创建
std::stack<std::string> words;
初始化,不能直接通过{}来初始化,
//stack<double>s{1.3,3.0,4.1}
初始化1
//容器初始化,第二个参数指明底层使用序列容器,默认是deque
std::list<double>values{1.414,3.14,2.7};
std::stack<std::double,std::list<double>>my_stack(values);
//一个栈拷贝初始化另一个
std::stack<double>copy_stack{my_stack};

常用接口

top():返回一个栈顶元素的引用,类型为 T&。如果栈为空,返回值未定义。
push(const T& obj):可以将对象副本压入栈顶。这是通过调用底层容器的 push_back() 函数完成的。
push(T&& obj):以移动对象的方式将对象压入栈顶。这是通过调用底层容器的有右值引用参数的 push_back() 函数完成的。
pop():弹出栈顶元素。
size():返回栈中元素的个数。
empty():在栈中没有元素的情况下返回 true。
emplace():用传入的参数调用构造函数,在栈顶生成对象。
swap(stack<T> & other_stack):将当前栈中的元素和参数中的元素交换。参数所包含元素的类型必须和当前栈的相同。对于 stack 对象有一个特例化的全局函数 swap() 可以使用。

队列

创建和初始化:和栈是一样的

std::queue<std::string>words;
std::queue<std::string>copy_words(words);
stack<T>、queue<T> 这类适配器类都默认封装了一个 deque<T> 容器,也可以通过指定第二个模板类型参数来使用其他类型的容器:
std::stack<std::double,std::list<double>>my_stack(values);

常用接口

front()//返回第一个元素的引用,如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
back()//返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
push(const T& obj):在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数push_back() 来完成的。
push(T&& obj):以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数 push_back() 来完成的。
pop()//删除 queue 中的第一个元素。
size()//返回 queue 中元素的个数。
empty()//如果 queue 中没有元素的话,返回 true。
emplace()//:用传给 emplace() 的参数调用 T 的构造函数,在 queue 的尾部生成对象。
swap(queque<T>&other_q)//将当前 queue 中的元素和参数 queue 中的元素交换。它们需要包含相同类型的元素。也可以调用全局函数模板 swap() 来完成同样的操作。

stack和queue元素访问方式

stack和queque没有迭代器,只能通过遍历容器,访问一个,弹出一个

deque<int>values{1,2,3,4,5};
queue<int>q(values);

while(!q.empty())
{
	cout<<q.front()<<" ";
	q.pop();
}
cout<<endl;

优先队列

priority_queue 容器适配器定义了一个元素有序排列的队列。默认队列头部的元素优先级最高

priority_queue 模板有 3 个参数,其中两个有默认的参数;第一个参数是存储对象的类型,第二个参数是存储元素的底层容器,默认是vector,第三个参数是函数对象,它定义了一个用来决定元素顺序的断言,默认是less,即最大元素排在前面,因此模板类型是:

template <typename T, typename Container=std::vector<T>, typename Compare=std::less<T>> class priority_queue

当然: greater,用来作为模板的最后一个参数对元素排序,最小元素会排在队列前面。当然,如果指定模板的最巵一个参数,就必须提供另外的两个模板类型参数。

实例如下:

#include<queue>
priority_queue<int, vector<int>, greater<int>> pque;

常用接口

push(const T& obj):将obj的副本放到容器的适当位置,这通常会包含一个排序操作。
push(T&& obj):将obj放到容器的适当位置,这通常会包含一个排序操作。
emplace(T constructor a rgs...):通过调用传入参数的构造函数,在序列的适当位置构造一个T对象。为了维持优先顺序,通常需要一个排序操作。
top():返回优先级队列中第一个元素的引用。
pop():移除第一个元素。
size():返回队列中元素的个数。
empty():如果队列为空的话,返回true。
swap(priority_queue<T>& other):和参数的元素进行交换,所包含对象的类型必须相同。
原文地址:https://www.cnblogs.com/Alexkk/p/12655928.html