【Boost】boost::assign庫介紹

來源:互聯網
上載者:User
// operator+=// 優點: 可應用與stl中定義的標準容器(vector, list, set, map等)// 缺點: 對於其他類型的容器(如boost新容器)則無能為力void test_assign_plus(){using namespace boost::assign;// 1. vectorstd::vector<int> values;values += 1, 2, 3, 4, 5, 6, 7, 8, 9; // 插入值到容器的末尾BOOST_ASSERT(values.size() == 9);BOOST_ASSERT(values[0] == 1);BOOST_ASSERT(values[8] == 9);// 2. set std::set<std::string> s;    //標準集合容器s += "cpp", "java", "c#", "python";BOOST_ASSERT(s.size() == 4);// 3. mapstd::map<int, std::string> m;m += std::make_pair(1, "one"),  std::make_pair(2, "two"),  std::make_pair(3, "three"),  std::make_pair(4, "four");BOOST_ASSERT(m[1] == "one");BOOST_ASSERT(m[2] == "two");BOOST_ASSERT(m[3] == "three");BOOST_ASSERT(m[4] == "four");}// operator()// 優點: operator+=使用上有些小的限制,而且在處理map容器也顯麻煩,操作符operator()更通用.//       不能直接使用operator(), 而應當使用assign庫提供三個輔助函數insert(),push_front(),push_back().//       這些函數可作用於擁有同名成員函數的容器,接受容器變數作為參數//       返回一個代理對象list_inserter,它重載了operator(),=等操作符用來實現向容器填入資料的功能。void test_assign_bracket(){using namespace boost::assign;std::vector<int> v;push_back(v), 1, 2, 3, 4, 5;push_back(v), 6, 7, 8;std::copy(v.cbegin(), v.cend(), std::ostream_iterator<int>(std::cout, " "));std::cout << std::endl;std::vector<int> l;push_back(l), 1, 2, 3, 4, 5;push_back(l), 6, 7, 8;std::copy(l.cbegin(), l.cend(), std::ostream_iterator<int>(std::cout, " "));std::cout << std::endl;std::deque<int> d;push_back(d), 1, 2, 3, 4, 5;push_back(d), 6, 7, 8;push_front(d), 0, -1, -2;std::copy(d.cbegin(), d.cend(), std::ostream_iterator<int>(std::cout, " "));std::cout << std::endl;std::map<std::string, int> months;insert(months)( "january",   31 )( "february", 28 )( "march",     31 )( "april",    30 )( "may",       31 )( "june",     30 )( "july",      31 )( "august",   31 )( "september", 30 )( "october",  31 )( "november",  30 )( "december", 31 );BOOST_ASSERT(months.size() == 12);    BOOST_ASSERT(months["january"] == 31);}// 初始化容器元素的函數: list_of(), map_list_of(), tuple_list_of()// 操作符+=和()解決了對容器的賦值問題,但有的時候需要在容器構造的時候就完成資料的填充,這種方式較賦值更為高效。// c++內建的數組和標準字串類string支援這樣做,但stl容器則不行。// list_of()函數的用法與之前的insert(),push_back()等函數很相似, 也重載了括弧, 逗號操作符。// 它很智能, 返回一個匿名的列表, 可以賦值給任意容器。void test_assign_list_of(){using namespace boost::assign;const std::list<int> l = list_of(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11);BOOST_ASSERT( l.size() == 11 );BOOST_ASSERT( l.back() == 11 );BOOST_ASSERT( l.front() == 1 );// 二維數組std::vector<std::vector<int>> v = list_of(list_of(1)(2)) (list_of(3)(4));v += list_of(5)(6), list_of(7)(8);// 兩個類似功能的ref_list_of()和cref_list_of(), // 這兩個函數接受變數的引用作為參數來建立初始化匿名列表,較list_of()的效率更高int a = 1, b = 2, c = 3;std::vector<int> v = ref_list_of<3>(a)(b)(c);assert(v.size() == 3);}void test_assign_map_list_of(){using namespace boost::assign;std::map<int, int> m1 = map_list_of(1, 2)(3, 4)(5, 6)(7, 8)(9, 10);std::map<int, std::string> m2 = map_list_of(1, "one")(2, "two")(3, "three")(4, "four");}// 減少重複輸入:// assign庫提供repeat(),repeat_fun()和range()三個函數來減少重複的輸入void test_assign_repeat(){using namespace boost::assign;std::vector<int> v = list_of(1).repeat(3, 2)(3)(4)(5);// 1, 2, 2, 2, 3, 4, 5std::copy(v.cbegin(), v.cend(), std::ostream_iterator<int>(std::cout, " "));std::cout << std::endl;std::deque<int> d;push_front(d).range(v.begin(), v.begin() + 5);// 3, 2, 2, 2, 1std::copy(d.cbegin(), d.cend(), std::ostream_iterator<int>(std::cout, " "));std::cout << std::endl;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.