所有代码都在Visual Studio 2017下测试过,应该是C++14标准。
1 std::string
头文件:<string>
功能:提供一系列字符串的操作
生成一个std::string对象
using
其它的两种相对不太常用,就不列举了。
查询std::string的长度
using
其它的不太常用,略过。
查询std::string的元素
str
两个std::string的比较
string
修改和替换std::string
string
还有一种迭代器用法和其他不常用用法,但是迭代器本质上和索引是等价的,就不再赘述了。
string
erase()函数还接受索引直接删除,这里也不赘述。
string
增加字符到std::string中
string
append的其他用法和insert类似,少一个插入位置就可以了。其它的用法比较少用,不赘述。这里的所有的索引都可以用迭代器替代,不赘述。
std::string的输入输出
string
std::string的查找
string
而其中,find_first_of()函数用于寻找目标串第一次出现的位置,find_last_of()函数用于寻找最后一次出现的位置。
std::string中迭代器的几种特殊用法
string
2 std::array
头文件:<array>
功能:提供类似于C的数组,长度恒定,且不需要自己管理内存。访问时不需要事先知道长度(长度储存在array模板类中)。
std::array的创建
using
std::array的访问
data
还有使用迭代器的访问方法,此处不再赘述。
std::array的比较和赋值
std
3 std::vector
头文件:<vector>
功能:提供一种自变长的类栈数据结构,适用于LIFO型数据结构。
std::vector的创建
using
std::vector的size(大小)和capacity(容量)
values
std::vector的访问
values
std::vector插入、删除元素
values
还有一种用随机访问迭代器来批量插入元素到vector的,比较花里胡哨,这里不赘述。
还有emplace和insert方法都可以在vector的任意位置插入元素,erase通过接受迭代器删除任意范围的元素,remove通过接收迭代器和特定的值来删除特定的元素。我认为这破坏了vector作为我认为的类栈的特性,如果真要用,那还不如直接用Python的list呢。
3.std::deque
头文件:<deque>
功能:提供双向队列的数据结构。
deque的创建
using
deque是没有capacity属性的,deque的capacity总是和size相等。
deque的访问和大小修改
words
这些基本都是和vector一样的,就不再赘述了。
deque添加和删除元素
deque
其它的insert()/erase()方法我认为破坏了双向队列的性质,不在这赘述。
4.std::list
头文件:<list>
功能:提供双向链表的构建方法。
list的创建
using
list的元素插入、删除
std
list元素的删除
std
list元素的排序和合并
std
list元素的访问
std
5.std::forward_list
头文件:<forward_list>
功能:提供单链表的实现。
forward_list的创建
std
forward_list的大小
auto
forward_list的插入和修改
std
6.std::stack
头文件:<stack>
功能:提供一个栈的实现
stack的创建
std
stack的系列操作
stack
7.std::queue
头文件:<queue>
功能:提供标准的FIFO容器的实现。
queue的创建
std
queue的一系列操作
queue<int,list<int>>q;
q.push(10);
q.front(); //返回10
q.size(); //返回1
q.empty();//返回false
q.push(20);
q.back();//返回20
q.pop();//不返回任何东西,弹出队首元素
q.pop();
q.empty();//返回true
q.emplace(10);//在队尾调用构造函数生成对象
queue<int,list<int>>q2;
q2.push(100);
q.swap(q2);//把q和q2的东西进行交换
q = q2;//使用operator=()重载进行赋值
要注意的是,queue和stack都不支持随机迭代器访问操作。
8.std::priority_queue
头文件:<priority_queue>
功能:提供一个类队列的,满足头元素出队的数据结构,优先队列中的所有元素都按指定的规则排列。
priority_queue的创建
std::priority_queue<std::string> words;
std::string wrds[] { "one", "two", "three", "four"};
std::priority_queue<std::string> words { std::begin(wrds),std:: end(wrds)};
std::priority_queue<std::string> copy_words {words}; // copy of words
std:: string wrds[] {"one", "two", "three", "four"};
std::priority_queue<std::string, std::vector<std::string>,std::greater<std::string>> words1 {std::begin (wrds) , std:: end (wrds) };
std::priority_queue<std::string, std:dequeue<std::string>,std::greater<std::string>> words1 {std::begin (wrds) , std:: end (wrds) };
第一种创建一个空的优先队列。
第二种创建一个使用数组+迭代器批量创建的优先队列。
第三种使用构造复制来复制一个优先队列。
第四种指定了一元谓词std::greater,用于指定排序规则。
第五种指定了底层容器,只要底层容器有front(),push_back(),pop_back(),size(),empty()的实现就可以。
priority_queue的操作
对priority_queue的所有操作都和queue的操作是一样的,插入时的位置搜索是由容器自动完成的,不需要使用者去写。
9.堆操作
在标准容器及容器适配器中,并没有对堆结构的定义,而是在algorithm头文件里面定义了基于vector的一系列堆操作。堆结构指的是一棵完全二叉树结构中,父节点均大于等于其叶子结点或均小于等于其叶子结点。
头文件:<algorithm>
功能:提供基于堆结构的一系列算法。
堆的创建
std
堆的维护
// 当数组的元素分布不符合堆的定义的时候,使用push_heap来把它重新组织成一个堆
numbers.push_back(1.2);
push_heap(std::begin(numbers),std::end(numbers));
//如果make_heap指定了一元谓词,在push_heap的时候也要指定同样的一元谓词
pop_heap(std:begin(numbers),std::end(numbers));
//把第一个元素移到最后,然后把前面的元素重新组合成一个堆,这个时候调用pop_back就可以把这个根弹出。
堆的判断
std::is_heap(std::begin(numbers),std::end(numbers),std::greater<>());
auto iter = std::is_heap_until(std::begin(numbers),std::end(numbers),std::greater<>());
if(iter != std::end(numbers))
std::cout << "numbers is a heap up to "<< *iter << std::endl;
第一种判断整个vector是否为heap,第二种判断第一个导致整个vector不为heap的迭代器位置。