序列容器和容器适配器


目录
  • 序列容器
    • 常用函数接口 array,deque,vector。
    • List和foward_list
    • 数组
    • Vector
      • emplace_back()和push_back()
      • emplace()和insert()
      • clear()
      • pop_back()
      • shrink_to_fit()
      • erase()
    • 栈stack
      • 常用接口
    • 队列
      • stack和queue元素访问方式
      • 优先队列

序列容器

array vector List
deque foward_list

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

函数成员 函数功能 array vector deque
begin() 返回指向容器中第一个元素的迭代器。
end() 返回指向容器最后一个元素所在位置后一个位置的迭代器,通常和 begin() 结合使用。
operator=() 复制同类型容器的元素,或者用初始化列表替换现有内容。
size() 返回实际元素个数。
capacity() 返回当前容量。 - -
empty() 判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。
front() 返回第一个元素的引用。
back() 返回最后一个元素的引用。
operatorhttps://blog.csdn.net/xiaolewennofollow/article/details/52559364

举例:

std::vector 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 a(100, 90);
a.clear();
cout << a.size() << endl;
cout << a.capacity() << endl;

out:
0
100

pop_back()

删除末尾元素

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

data.pop_back()

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

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

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

shrink_to_fit()

去掉容器中多余的容量

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

vector 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 words;
初始化,不能直接通过{}来初始化,
//stacks{1.3,3.0,4.1}
初始化1
//容器初始化,第二个参数指明底层使用序列容器,默认是deque
std::listvalues{1.414,3.14,2.7};
std::stack>my_stack(values);
//一个栈拷贝初始化另一个
std::stackcopy_stack{my_stack};

常用接口

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

队列

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

std::queuewords;
std::queuecopy_words(words);
stack、queue 这类适配器类都默认封装了一个 deque 容器,也可以通过指定第二个模板类型参数来使用其他类型的容器:
std::stack>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&other_q)//将当前 queue 中的元素和参数 queue 中的元素交换。它们需要包含相同类型的元素。也可以调用全局函数模板 swap() 来完成同样的操作。

stack和queue元素访问方式

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

dequevalues{1,2,3,4,5};
queueq(values);

while(!q.empty())
{
	cout<

优先队列

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

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

template , typename Compare=std::less> class priority_queue

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

实例如下:

#include
priority_queue, greater> pque;

常用接口

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