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通常更适合
- 函数对象的概念
重载函数调用操作符"()“的类,其对象常称为函数对象(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方法
遍历
-
map<string,int>::iterator it;
-
for(it=m.begin();it!=m.end();++it)
-
cout<<"key: "<<it->first <<" value: "<<it->second<<endl;