STL常用容器

std::list

双向链表; 也是一个环形链表;标准模板库(STL)以模板类 std::list 的方式向程序员提供了一个双向链表。双向链表的主要优点是,插入和删除元素的速度快,从 C++11 起,您还可使用单向链表 std::forward_list,
这种链表只能沿一个方向遍历

push_back插入链表位尾部; front()第一个元素  back()最后一个元素,在中间插入元素是哟个 insert(迭代器, 数据),返回刚插入的元素的位置的迭代器iterator, 有种方式:

第 1 种版本: 
 
iterator insert(iterator pos, const T& x) 
 
在这里,insert 函数接受的第 1 个参数是插入位置,第 2 个参数是要插入的值。该函数返回一
个迭代器,它指向刚插入到 list 中的元素。 
•   第 2 种版本: 
 
void insert(iterator pos, size_type n, const T& x) 
 
该函数的第 1 个参数是插入位置,最后一个参数是要插入的值,而第 2 个参数是要插入的元素
个数。 
•   第 3 种版本: 
 
template <class InputIterator> 
void insert(iterator pos, InputIterator f, InputIterator l) 
 
该重载版本是一个模板函数,除一个位置参数外,它还接受两个输入迭代器,指定要将集合中
相应范围内的元素插入到 list 中。注意,输入类型 InputIterator 是一种模板参数化类型,因此
可指定任何集合(数组、vector 或另一个 list)的边界。

1.使用list::reverse( )反转元素的排列顺序

该函数没有参数,它反转 list 中元素的排列顺序
 
linkInts.reverse(); // reverse order of elements 

2.list 的成员函数 sort()有两个版本

不接受参数 linkInts.sort()  升序

接受参数,传入一个二元谓词

list 的一个独特之处是,指向元素的迭代器在 list 的元素重新排列或插入元素后仍有效。

,list 提供了成员方法 sort()和 reverse(),虽然 STL 也提供了这两种算法,且这些算法也可用于
list 类。这些算法的成员函数版本确保元素的相对位置发生变化后指向元素的迭代器仍有效。 

push_front插入第一个节点前

push_back()尾部插入

erase(迭代器) 移除迭代器指向节点, erase(迭代器1, 迭代器2),返回删除的迭代器的下一个迭代器位置

remove(值), 相同的值都会删除,返回空

pop_front 移除头节点

pop_back 移除尾节点

clear() 清空整个list

begin()迭代器

front()第一个元素

end() 

back()最后一个元素

empty()

size()

一个比较相近的是std::forward_list  ,这是单向链表,只能从前面插入元素 ,push_front()

#include<forward_list>

---------------------------------------------------------------------------------------------------------------------------------

std::queue

先进先出 FIFO First In First Out

尾部加入元素push()  头部取出元

不可遍历 不可从中间插入 无迭代器

 empty()

size()

front()

back()

 std::priority_queue, STL priority_queue 是一个模板类,要使用它,也必须包含头文件<queue>。与 queue的不同之处在于,包含最大值(或二元谓词认为是最大值)的元素位于队首,且只能在队首执行操作。源码

template < 
   class elementType, 
   class Container=vector<Type>, 
      class Compare=less<typename Container::value_type> 

class priority_queue 

priority_queue 类将默认使用 std::less,它使用运算符<比较对象, 但是这里是一个大顶堆,即头部是最大值,这个和std::set刚好是反的

queue提供了成员函数front( )和back( ), 但priority_queue没有,其方法有

从该表可知,只能使用 top( )来访问队列的成员,该函数返回值最大的元素,最大的元素是根据用
户指定的谓词或默认的 std::less 确定的。  

-------------------------------------------------------------------------------------------------------------------------

#include <set> 

std::set 用于经常查找的场合 ,在需要频繁插入而很少查找的情形下,不要使用std::set或std::multiset; 在这种情形下, std::vector和std::list通常更适合

  1. 函数对象的概念
    重载函数调用操作符"()“的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也
    仿函数(functor),其实就是重载”()"操作符,使得类对象可以像函数那样调用

返回bool类型的仿函数称为谓词
如果operator()接受一个参数,那么叫做一元谓词
如果operator()接受两个参数,那么叫做二元谓词

其属于关联容器,不过只有键值,容器会根据键值自动排序,可以自定义谓词来定义排序得规则。

不会重复元素

默认采用的是std::less 递增排序,头元素最小,属于一元谓词,

std::set<int, std::greater>递减排序

如果是排序需要二元谓词,需自定义二元谓词  

(返回bool类型的仿函数称为谓词)

template<typename T>

struct SortDescending{

bool operator(const& T lhs, const& T rhs  ) const

{

        return lhs > rhs;

}

}

或是类来构成函数对象

template<typename T>

class SortDescending{

public:

bool operator(const T& a,  constT& b)const

{

        return a > b;

}

}

//递减排序

std::set<int, SortDescending<int>() > setints

std::multiset<int,  SortDescending<int>() >multisetints

这种关联容器都提供查找对象find(), 通过给定键值来查找元素,返回该值的迭代器

对于 multiset,这个函数查找第一个与给定键匹配的元素。

for_each()用法

std::set<int>sol

sol.intsert(1);

sol.insert(12);

for(sol.begin(),  sol.end(), [](int ement){std::cout<<ement;});

查找元素,关联容器都有查找元素函数find(), 传入键值,返回迭代器,对于multiset有可能有重复的元素,返回的是第一个元素迭代器的位置

auto elementFound = setInts.find (-1); 
// Check if found... 
if (elementFound != setInts.end ()) 
   cout << "Element " << *elementFound << " found!" << endl; 
else 
   cout << "Element not found in set!" << endl; 

删除元素

erase(),可以传入键值,也可是迭代器,也可以指定范围开始迭代器和结束迭代器

基于set的散列std::unordered_set, 头文件#include <unordered_set>

用 multiset::count(value)确定有多少个元素包含特定的值。

请牢记, set::size( )和multiset::size( )指出容器包含多少个元素。 

对于其对象将存储在set或multiset等容器中的类,别忘了在其中实现运算符<和==。前者将成为
排序谓词,而后者将用于set::find( )等函数。 

std::map

可以用std::pair<type, type>进行赋值

map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。

对于迭代器来说,可以修改实值,而不能修改key。

根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。

快速插入Key -Value 记录。

快速删除记录

根据Key 修改value记录。

遍历所有记录。

查找map中是否包含某个关键字条目用find方法

遍历

  1. map<string,int>::iterator it;

  2. for(it=m.begin();it!=m.end();++it)

  3. cout<<"key: "<<it->first <<" value: "<<it->second<<endl;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STL(Standard Template Library)提供了一个名为`std::map`的关联容器,它基于红黑树实现,用于存储键值对,并按照键的顺序进行排序。下面是`std::map`容器的一些常用方法: 1. 插入元素: ```cpp std::map<Key, Value> myMap; myMap.insert(std::make_pair(key, value)); // 使用insert方法插入键值对 myMap[key] = value; // 使用下标操作符[]插入键值对,如果键已存在,则会更新值 ``` 2. 删除元素: ```cpp myMap.erase(key); // 根据键删除元素 myMap.clear(); // 清空所有元素 ``` 3. 访问元素: ```cpp Value value = myMap[key]; // 使用下标操作符[]访问指定键对应的值 auto it = myMap.find(key); // 使用find方法查找指定键的迭代器 if (it != myMap.end()) { Value value = it->second; // 通过迭代器访问指定键对应的值 } ``` 4. 遍历容器: ```cpp for (const auto& pair : myMap) { Key key = pair.first; // 键 Value value = pair.second; // 值 // 其他操作 } ``` 5. 判断元素是否存在: ```cpp if (myMap.count(key) > 0) { // 键存在 } ``` 6. 获取容器大小和判断容器是否为空: ```cpp size_t size = myMap.size(); // 获取容器中键值对的个数 bool isEmpty = myMap.empty(); // 判断容器是否为空 ``` 这些是`std::map`容器的一些常用方法,还有其他一些方法和成员函数可以进一步扩展其功能。你可以参考C++标准库的文档以获取更详细的信息。 希望对你有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值