zoukankan      html  css  js  c++  java
  • C++ std::forward_list 基本用法

    #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 << "
    ";
    		std::cout << "list2:  " << list2 << "
    ";
    		list1.merge(list2); // 必须是有序的,元素的 < 必须有定义。// lis2 变为空
    		std::cout << "merged: " << list1 << "
    ";
    	}
    
    	{
    		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 << "
    ";
    		std::cout << "list2:  " << list2 << "
    ";
    		list1.merge(list2, [](int a, int b) { return a + 1 < b; }); // 自定义 < 的比较方法,lambda 表达式。// lis2 变为空
    		std::cout << "merged: " << list1 << "
    ";
    	}
    
    	{
    		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 << "
    ";
    		std::cout << "list2:  " << list2 << "
    ";
    		list1.merge(list2, compAB); // 函数名。// lis2 变为空
    		std::cout << "merged: " << list1 << "
    ";
    	}
    
    	//////////////////////////////////////////////////////////////////////////
    
    	{
    		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 << '
    ';
    	}
    
    	//////////////////////////////////////////////////////////////////////////
    	
    	// 逆转容器中的元素顺序。不非法化任何引用或迭代器。 
    	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 << '
    ';
    
    		x.unique(); // 1 2 3 2 1 2
    		std::cout << "contents after unique():";
    		for (auto val : x)
    			std::cout << ' ' << val;
    		std::cout << '
    ';
    
    		return 0;
    	}
    
    	//////////////////////////////////////////////////////////////////////////
    	// sort
    	{
    		std::forward_list<int> list = { 8,7,5,9,0,1,3,2,6,4 };
    
    		std::cout << "before:     " << list << "
    ";
    		list.sort(); // 默认升序
    		std::cout << "ascending:  " << list << "
    ";
    		list.sort(std::greater<int>()); // 降序
    		std::cout << "descending: " << list << "
    ";
    
    		// 类,要重载 < 
    		// 或者,传参 lambda 表达式
    	}
    
    
    }
    

      

  • 相关阅读:
    hdu1089
    hdu1088
    驴妈妈
    途牛悄然上市 登陆SEC途牛前景如何
    途牛旅游网
    百度-----携程
    携程旅行网
    手机游戏
    web
    改造 改革
  • 原文地址:https://www.cnblogs.com/alexYuin/p/12045972.html
Copyright © 2011-2022 走看看