c++string用法_C++知识总结——STL容器的常用用法(持续更新)

3b77d21d1dcf493a99f554c52630da42.png

所有代码都在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的迭代器位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值