string

  • string str——构造空的string类对象,即空字符串
  • string str(str1)——str1 和 str 一样
  • string str(“ABC”)——等价于 str=“ABC”
  • string str(srelen,‘A’)——存储 strlen 个 ‘A’ 到 str 中
  • str.length()——求字符串长度
  • str.size()——和 length() 一样
  • str.find(‘A’)——查找 ‘A’
  • str.find(“ABC”)——查找 “ABC”
  • str.find(‘B’,1)——从 位置1 处,查找’B’
  • str1=str.substr(2)——提取子串,提取出 str 的 下标为2 到末尾,给 str1
  • str1=str.substr(2,3)——提取子串,提取出 str 的 下标为2 开始,提取三个字节,给 str1
  • push_back和popback,与vector类似

queue

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

deque

  • push_back(elem);//在容器尾部添加一个数据
  • push_front(elem);//在容器头部插入一个数据
  • pop_back();//删除容器最后一个数据
  • pop_front();//删除容器第一个数据
  • front();//返回第一个数据。
  • back();//返回最后一个数据
  • insert(pos,elem);//在pos位置插入一个elem元素的拷贝,返回新数据的位置。
  • insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
  • insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
  • clear();//移除容器的所有数据
  • erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
  • erase(pos);//删除pos位置的数据,返回下一个数据的位置。

priority_queue

template ,
class Compare = less > class priority_queue;

  • top 访问队头元素
  • empty 队列是否为空
  • size 返回队列内元素个数
  • push 插入元素到队尾 (并排序)
  • emplace 原地构造一个元素并插入队列
  • pop 弹出队头元素
  • swap 交换内容
  • priority_queue ,greater > q;
  • priority_queue ,less >q;对于基础类型,默认为大顶堆。
  • auto cmp = {return a&1 == b&1 ? a > b : a > b;};
  • priority_queue,decltype(cmp)> pq(cmp);

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() 可以使用。

四种有序关联容器

set

其值类型与键相同,键是唯一的。这意味着集合中不会有多个相同的键。set跟vector差不多,它跟vector的唯一区别就是,set里面的元素是有序的且唯一的,只要你往set里添加元素,它就会自动排序,而且,如果你添加的元素set里面本来就存在,那么这次添加操作就不执行。

  • begin(); // 返回指向第一个元素的迭代器
  • end(); // 返回指向迭代器的最末尾处(即最后一个元素的下一个位置)
  • clear(); // 清除所有元素
  • count(); // 返回某个值元素的个数,只能返回0,1
  • empty(); // 如果集合为空,返回true
  • equal_range(); //返回集合中与给定值相等的上下限的两个迭代器
  • erase()–删除集合中的元素
  • find()–返回一个指向被查找到元素的迭代器
  • get_allocator()–返回集合的分配器
  • insert()–在集合中插入元素
  • lower_bound()–返回指向大于(或等于)某值的第一个元素的迭代器
  • key_comp()–返回一个用于元素间值比较的函数
  • max_size()–返回集合能容纳的元素的最大限值
  • rbegin()–返回指向集合中最后一个元素的反向迭代器
  • rend()–返回指向集合中第一个元素的反向迭代器
  • size()–集合中元素的数目
  • swap()–交换两个集合变量
  • upper_bound()–返回大于某个值元素的迭代器

multiset

multiset 容器就像 set 容器,但它可以保存重复的元素。这意味我们总可以插入元素,当然必须是可接受的元素类型。默认用 less 来比较元素,但也可以指定不同的比较函数。在元素等价时,它必须返回 false。例如:

  1. std::multiset> words{{“dog”, “cat”, “mouse”}, std::greater()};

这条语句定义了一个以 string 为元素的 multiset,它以 greater 为构造函数的第二个参数。构造函数的第一个参数是一个初始化列表,它为这个容器指定了三个初始元素。和 set 一样,如果它的两个元素相等,那么它们就是匹配的。在一个有比较运算符 comp 的 multiset 中,如果表达式 !(a comp b) && !(b comp a) 为 true,那么元素 a 和 b 就是相等的。

  • multiset 容器和 set 容器有相同的成员函数,但是因为 multiset 可以保存重复元素,有些函数的表现会有些不同。和 set 容器中的成员函数表现不同的是:
  • insert() 总是可以成功执行。当插入单个元素时,返回的迭代器指向插入的元素。当插入一段元素时,返回的迭代器指向插入的最后一个元素。
  • emplace() 和 emplace_hint() 总是成功。它们都指向创建的新元素。
  • find() 会返回和参数匹配的第一个元素的迭代器,如果都不匹配,则返回容器的结束迭代器。
  • equal_range() 返回一个包含迭代器的 pair 对象,它定义了一个和参数匹配的元素段。如果没有元素匹配的话,pair 的第一个成员是容器的结束迭代器;在这种情况下,第二个成员是比参数大的第一个元素,如果都没有的话,它也是容器的结束迭代器。
  • lower_bound() 返回和参数匹配的第一个元素的迭代器,如果没有匹配的元素,会返回容器的结束迭代器。返回的迭代器和 range() 返回的 pair 的第一个成员相同。
  • upper_bound() 返回的迭代器和 equal_range() 返回的 pair 的第二个成员相同。
  • count() 返回和参数匹配的元素的个数。

map

map运用了哈希表地址映射的思想,也就是key-value的思想,来实现的,底层和set一样都是用红黑树实现。内部元素按照key哈希排序。首先给出map最好用也最最常用的用法例子,就是用字符串作为key去查询操作对应的value。
mapStudent.insert(pair(000, “student_zero”));
mapStudent.insert(map::value_type(001, “student_one”));
mapStudent[123] = “student_first”;
在数据插入上涉及到集合的唯一性这个概念,即当map中有这个关键字时,insert操作是不能在插入数据的,但是用数组方式就不同了,它可以覆盖以前该关键字对 应的值,
可以用pair来获得是否插入成功,程序如下
// 构造定义,返回一个pair对象
pair insert (const value_type& val);
pair::iterator, bool> Insert_Pair;
Insert_Pair = mapStudent.insert(map::value_type (001, “student_one”));
if(!Insert_Pair.second)
cout << “”Error insert new element” << endl;
我们通过pair的第二个变量来知道是否插入成功,它的第一个变量返回的是一个map的迭代器,如果插入成功的话Insert_Pair.second应该是true的,否则为false。
//迭代器刪除
iter = mapStudent.find(“123”);
mapStudent.erase(iter);
//用关键字刪除
int n = mapStudent.erase(“123”); //如果刪除了會返回1,否則返回0
//用迭代器范围刪除 : 把整个map清空
mapStudent.erase(mapStudent.begin(), mapStudent.end());
//等同于mapStudent.clear()


multimap

multimap也是可以反转的,经过排序的关联容器,但键和值的类型不同,且同一个键可能与多个值相关联。

四种无序关联容器

无序关联容器是对容器概念的另一种改进。与关联容器一样,无序关联容器也将键与值关联起来,并使用键来查找值,但底层的差别在于,关联容器是基于树结构的,而无序关联容器是基于数据结构哈希表的

unordered_set

存储原理是声明一个有n个桶的数据结构,计算加入到unordered_set的新的值hash,然后计算hash%n后的值x,将新的值加入到桶x中。当桶x中已经有了元素,就直接链接在后边。当数据结构中的元素满足一定数量时我们要扩充桶的数量,并重新构建桶结构。
std::unordered_set c:初始化容器
std::unordered_set c{ “aaa”, “bbb”, “ccc” }:初始化容器,并将”aaa”, “bbb”, “ccc”加入到容器中
std::unordered_set c{ 16 }:初始化容器,并设置16个桶
//添加新的元素(注意无法插入相同元素)
c.insert(“dddd”):向容器添加元素”dddd”
a.insert({ “aaa”,”bbbb”,”cccc” }):向容器添加元素”aaa”,”bbbb”,”cccc”
a.insert(b.begin(), b.end()):b是一个存储着和a相同类型元素的向量,可将b中所有元素添加到a中
//查找元素
a.find(“eeee”):查找元素”eeee”,返回结果为a.end()则表明没有找到,否则返回所对应元素
a.count(“eeee”):查找元素”eeee”在a中有几个(由于unordered_set中没有相同的元素,所以结果通常为0或1)
//查找桶接口
a.bucket_count():返回数据结构中桶的数量
a.bucket_size(i):返回桶i中的大小
a.bucket(“eeee”):返回元素”eeee”在哪个桶里
//观察器
a.hash_function()(“aaa”):返回”aaa”所对应的hash值
a.key_eq()(“aaa”,”aaaa”) :当元素相同时返回true,否则返回false


unordered_multiset


unordered_map


unordered_mutimap