#include <iostream>
#include <string>
#include <forward_list> using namespace std; // https://zh.cppreference.com/w/cpp/container/forward_list std::ostream& operator<<(std::ostream& ostr, const std::forward_list<int>& list)
{
for (auto &i : list) {
ostr << " " << i;
}
return ostr;
} class item
{
public:
item() = delete; item(const int& a, const int& b)
: m_a(a), m_b(b)
{} bool operator< (const item& comp) const
{
return m_a*m_b < comp.m_a*comp.m_b;
} bool operator== (const item& comp) const
{
return m_a==comp.m_a && m_b==comp.m_b;
} private:
int m_a;
int m_b;
}; bool compAB(int a, int b)
{
return a + 1 < b;
} int main()
{
int a[] = { 1,2,3 };
forward_list<int> lis;
forward_list<int> lis2(4);
forward_list<int> lis3(4, 5);
forward_list<item> lis5(4, item(1, 2));
forward_list<item> lis6(4, { 1, 2 });
forward_list<item> lis7(lis6);
forward_list<int> lis8(a, a + 3);
forward_list<item> lis9(lis7.begin(), lis7.end());
forward_list<int> lis4({ 1,2,3 }); ////////////////////////////////////////////////////////////////////////// int v_front = lis4.front(); std::forward_list<int>::iterator
it_bb = lis4.before_begin(); // 返回指向第一个元素之前迭代器
auto cit_bb = lis4.cbefore_begin(); auto it_b = lis4.begin();
auto cit_b = lis4.cbegin(); auto it_e = lis4.end();
auto cit_e = lis4.cend(); ////////////////////////////////////////////////////////////////////////// // 没有 size bool isEmpty = lis4.empty();
size_t max_size = lis4.max_size(); // 并非实际可以申请到的大小 ////////////////////////////////////////////////////////////////////////// lis4.clear();
lis4 = { 1,2,3 }; // iterator insert_after(const_iterator pos, const T& value);
lis4.insert_after(lis4.before_begin(), 77); // 78 1 2 3
lis4.insert_after(lis4.begin(), 78); // 77 78 1 2 3 // iterator insert_after( const_iterator pos, size_type count, const T& value );
lis4.insert_after(lis4.before_begin(), 2, 79); // 79 79 78 1 2 3 forward_list<int> lis10({ 10,20,30 });
// template< class InputIt >
// iterator insert_after(const_iterator pos, InputIt first, InputIt last);
lis4.insert_after(lis4.before_begin(), lis10.begin(), lis10.end()); // 10 20 30 79 79 78 1 2 3 lis4.insert_after(lis4.before_begin(), { 11,22 }); // 11 22 10 20 30 79 79 78 1 2 3 ////////////////////////////////////////////////////////////////////////// // 在容器中的指定位置后插入新元素。原位构造元素,即不进行复制或移动操作。
lis4.emplace_after(lis4.begin(), 555); // 11 555 22 10 20 30 79 79 78 1 2 3 // iterator erase_after( const_iterator pos );
// 从容器移除指定元素。
lis4.erase_after(lis4.begin()); // 11 22 10 20 30 79 79 78 1 2 3 ////////////////////////////////////////////////////////////////////////// lis4.push_front(666); // 666 11 22 10 20 30 79 79 78 1 2 3
lis4.emplace_front(777); // 777 666 11 22 10 20 30 79 79 78 1 2 3
lis4.pop_front(); // 666 11 22 10 20 30 79 79 78 1 2 3 ////////////////////////////////////////////////////////////////////////// lis4.resize(2); // 缩小,保留前两个
lis4.resize(5); // 放大,补默认值,这里是 0 lis4.swap(lis8); ////////////////////////////////////////////////////////////////////////// // merge: 排序后,把 2 的元素 移动 到 1 中。
{
std::forward_list<int> list1 = { 5,9,0,1,3,10,0 };
std::forward_list<int> list2 = { 8,7,2,6,4 }; list1.sort();
list2.sort();
std::cout << "list1: " << list1 << "\n";
std::cout << "list2: " << list2 << "\n";
list1.merge(list2); // 必须是有序的,元素的 < 必须有定义。// lis2 变为空
std::cout << "merged: " << list1 << "\n";
} {
std::forward_list<int> list1 = { 5,9,0,1,3 };
std::forward_list<int> list2 = { 8,7,2,6,4 }; list1.sort();
list2.sort();
std::cout << "list1: " << list1 << "\n";
std::cout << "list2: " << list2 << "\n";
list1.merge(list2, [](int a, int b) { return a + 1 < b; }); // 自定义 < 的比较方法,lambda 表达式。// lis2 变为空
std::cout << "merged: " << list1 << "\n";
} {
std::forward_list<int> list1 = { 5,9,0,1,3 };
std::forward_list<int> list2 = { 8,7,2,6,4 }; list1.sort();
list2.sort();
std::cout << "list1: " << list1 << "\n";
std::cout << "list2: " << list2 << "\n";
list1.merge(list2, compAB); // 函数名。// lis2 变为空
std::cout << "merged: " << list1 << "\n";
} ////////////////////////////////////////////////////////////////////////// {
forward_list<int> lis11({ 10,20,30 });
forward_list<int> lis12({ 101,201,301 }); // void splice_after( const_iterator pos, forward_list& other );
lis11.splice_after(lis11.before_begin(), lis12); // 101,201,301 10,20,30
} {
forward_list<int> lis11({ 10,20,30 });
forward_list<int> lis12({ 101,201,301 });
// void splice_after( const_iterator pos, forward_list& other, const_iterator it );
lis11.splice_after(lis11.before_begin(), lis12, lis12.begin()); // 201 10,20,30 // 迭代器的后一个元素
} {
forward_list<int> lis11({ 10,20,30 });
forward_list<int> lis12({ 101,201,301 });
auto it12 = lis12.begin();
std::advance(it12, 2);
// void splice_after( const_iterator pos, forward_list& other,
// const_iterator first, const_iterator last );
lis11.splice_after(lis11.before_begin(), lis12, lis12.before_begin(), it12); // 101,201 10,20,30 // 最后的两个迭代器,是开集
} ////////////////////////////////////////////////////////////////////////// {
std::forward_list<int> l = { 1,100,2,3,10,1,11,-1,12 }; l.remove(1); // 移除两个等于 1 的元素
l.remove_if([](int n) { return n > 10; }); // 移除全部大于 10 的元素 for (int n : l) {
std::cout << n << ' ';
}
std::cout << '\n';
} ////////////////////////////////////////////////////////////////////////// // 逆转容器中的元素顺序。不非法化任何引用或迭代器。
forward_list<int> lis13({ 10,20,30 });
lis13.reverse(); //////////////////////////////////////////////////////////////////////////
// 从容器移除所有 相邻 的重复元素。只留下相等元素组中的第一个元素。
{
std::forward_list<int> x = { 1, 2, 2, 3, 3, 2, 1, 1, 2 }; std::cout << "contents before:";
for (auto val : x)
std::cout << ' ' << val;
std::cout << '\n'; x.unique(); // 1 2 3 2 1 2
std::cout << "contents after unique():";
for (auto val : x)
std::cout << ' ' << val;
std::cout << '\n'; return 0;
} //////////////////////////////////////////////////////////////////////////
// sort
{
std::forward_list<int> list = { 8,7,5,9,0,1,3,2,6,4 }; std::cout << "before: " << list << "\n";
list.sort(); // 默认升序
std::cout << "ascending: " << list << "\n";
list.sort(std::greater<int>()); // 降序
std::cout << "descending: " << list << "\n"; // 类,要重载 <
// 或者,传参 lambda 表达式
} }

  

C++ std::forward_list 基本用法的更多相关文章

  1. C++ std::forward_list

    std::forward_list template < class T, class Alloc = allocator > class forward_list; Forward li ...

  2. C++ std::list 基本用法

    #include <iostream> #include <string> #include <list> using namespace std; // http ...

  3. C++ std::map::erase用法及其陷阱

    1.引入: STL的map中有一个erase方法用来从一个map中删除制定的节点 eg: map<string,string> mapTest; typedef map<string ...

  4. QLinkedList和std::forward_list

    forward_list forward_list是C++11版本才有的.forward_list被实现为单链表,而list是一个双向链表,所以forward_list要比list高效一些.forwa ...

  5. QLinkedList和std::forward_list(都是双向链表,不支持operator[],好处可能是插入和删除都比较快)

    forward_list forward_list是C++11版本才有的.forward_list被实现为单链表,而list是一个双向链表,所以forward_list要比list高效一些.forwa ...

  6. C++ std::pair的用法

    1 pair的应用 pair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存.另一个应用是,当一个函数需要返回2个数据的时候, ...

  7. std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题

    在std::shared_ptr被引入之前,C++标准库中实现的用于管理资源的智能指针只有std::auto_ptr一个而已.std::auto_ptr的作用非常有限,因为它存在被管理资源的所有权转移 ...

  8. C++ std::list 和 std::forward_list 的差别及其成员函数差异对比

    主要差别: list 是双向链表,forward_list 是双向链表. 成员函数差异: 函数名 list forward_list back() has no size() has no inser ...

  9. 容器之分类与各种测试(三)——forward_list的用法

    forward_list是C++11规定的新标准单项链表,slist是g++以前的规定的单项链表 例程 #include<stdexcept> #include<string> ...

随机推荐

  1. ARTS-S 最难的事情

    小朋友不舒服,看了医生也开了药吃了.但还是一直闹,不睡觉,弄的我和我爱人精疲力尽. 现在看来,技术上的难题真不算什么.照顾小朋友才是这个世界上最难的事情.

  2. 用FPGA设计LCD 转 VGA

    这个东西其实是在上一个冬天就做完了,而且似乎已经产业化了,当时是为一位朋友做的,这个朋友再卖给产业化的人,就像流于俗套的故事一样,这个朋友拿到了钱,不过不像项目开始时说的那样与我有关.想想多年前一起吃 ...

  3. Python3 常用模块3

    目录 numpy模块 创建numpy数组 numpy数组的属性和用法 matplotlib模块 条形图 直方图 折线图 散点图 + 直线图 pandas模块 numpy模块 numpy模块可以用来做数 ...

  4. android开发检测用户是否使用了虚拟定位

    在应用开发中,如果有签到打卡之类的功能,你是否会遇到检测用户是否使用了虚拟定位软件来进行打卡?如果有,那么请仔细阅读这篇文章.该文章会带你认识什么是虚拟定位.什么是应用分身,以及如何通过代码来检测用户 ...

  5. Python 进阶之源码分析:如何将一个类方法变为多个方法?

    前一篇文章<Python 中如何实现参数化测试?>中,我提到了在 Python 中实现参数化测试的几个库,并留下一个问题: 它们是如何做到把一个方法变成多个方法,并且将每个方法与相应的参数 ...

  6. 曹工说Spring Boot源码(4)-- 我是怎么自定义ApplicationContext,从json文件读取bean definition的?

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码系列开讲了(1)-- Bean Definition到底是什么,附spring思维导图分享 工程代码地址 思维导图地址 工程结构图: 大 ...

  7. ASP.NET操作Excel

    使用NPOI操作Excel,无需Office COM组件 部分代码来自于:https://docs.microsoft.com/zh-tw/previous-versions/ee818993(v=m ...

  8. pip install pyspider失败的解决办法

    td{ width:10000px } 报错 下载pycurl库 地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#pycurl 选择对应的python版本 ...

  9. git中的SSL certificate problem: unable to get local issuer certificate错误的解决办法

    我们在使用git初始化一个项目时,尤其是通过git submodule update --init --remote初始化子模块时,可能会遇到下面这个错误: fatal: unable to acce ...

  10. 通过 loganalyzer 展示数据库中的系统日志

    目录 通过 loganalyzer 展示数据库中的日志 环境准备 准备服务器: 日志服务器: 数据库服务器: 测试日志服务器和数据库是否连接: websrv服务器端: 通过 loganalyzer 展 ...