#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 表达式 } }
来源:https://www.cnblogs.com/alexYuin/p/12045972.html