Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2631046
  • 博文数量: 315
  • 博客积分: 3901
  • 博客等级: 少校
  • 技术积分: 3640
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-08 15:32
个人简介

知乎:https://www.zhihu.com/people/monkey.d.luffy Android高级开发交流群2: 752871516

文章分类

全部博文(315)

文章存档

2019年(2)

2018年(1)

2016年(7)

2015年(32)

2014年(39)

2013年(109)

2012年(81)

2011年(44)

分类: C/C++

2013-04-14 00:18:21


点击(此处)折叠或打开

  1. // STL.cpp : 定义控制台应用程序的入口点。
  2. //

  3. #include "stdafx.h"
  4. #include <ctime>
  5. #include <cstdlib>
  6. #include <map>
  7. #include <string>
  8. #include <iostream> // std::cout
  9. #include <algorithm> // std::find_if
  10. #include <vector> // std::vector
  11. #include<list>            // std::list    

  12. using namespace std;

  13. /************************************************************************/
  14. /* <set>容器 模版<隐式申明、显示申明、正则表达式> count_if... */
  15. /************************************************************************/

  16. /************************************************************************/
  17. /* for_each调用函数【指针】 */
  18. /************************************************************************/
  19. static void printName(pair<int, string> it);
  20. static void printName2(int it);
  21. #define SHOW_VECTOR(T, vct)    \
  22.     for (vector<T>::iterator it = vct.begin(); it != vct.end(); )    \
  23. {    \
  24.     cout << *(it++) << endl;\
  25. }\

  26. bool IsOdd (int i) {
  27.     return ((i%2)==1);
  28. }

  29. bool isInteresting(const int * pw)
  30. {
  31.     return ((*pw % 2) == 0);
  32. }

  33. int _tmain(int argc, _TCHAR* argv[])
  34. {
  35.     /**
  36.     * Vector【注释释放容器元素后,元素会重新“凑紧“】
  37.     */
  38.     int i = 0, temp;
  39.     vector<int> IntV;
  40.     srand(unsigned(time(0)));
  41.     for (i = 0; i < 10; ++i)
  42.     {
  43.         temp = rand()%10;
  44.         IntV.push_back(temp);
  45.     }
  46.     vector<int>::iterator it;
  47.     for (it = IntV.begin(); it != IntV.end(); ++it)
  48.     {
  49.         cout << *it << endl;
  50.     }
  51.     for (it = IntV.begin(); it != IntV.end(); )
  52.     {
  53.         if (*it < 2)
  54.         {
  55.             it = IntV.erase(it);
  56.         }
  57.         else
  58.         {
  59.             it++;
  60.         }
  61.     }
  62.     cout << endl;
  63.     for (it = IntV.begin(); it != IntV.end(); ++it)
  64.     {
  65.         cout << *it << endl;
  66.     }
  67.     ///< another function
  68.     for_each(IntV.begin(), IntV.end(), printName2);

  69.     /**
  70.     * Map
  71.     */
  72.     map<int, string> kv;
  73.     kv.insert(pair<int, string>(1, "大地"));
  74.     kv.insert(map<int, string>::value_type(25, "gege"));
  75.     kv[3] = "simi达";

  76.     for (map<int, string>::iterator it = kv.lower_bound(1);
  77.         it != kv.upper_bound(25); ++it)
  78.     {
  79.         cout << "当前号 " << it->first << endl;
  80.         cout << "姓名 " << it->second << endl;
  81.     }
  82.     ///< another function
  83.     for_each(kv.begin(), kv.end(), printName);
  84.     ///< find... find_if... remove... replace_if...

  85.     /**
  86.     * 容器拷贝
  87.     */
  88.     vector<float> fdata;
  89.     fdata.push_back(5.0);
  90.     fdata.push_back(4.0);
  91.     fdata.resize(10);
  92.     cout << "fdata size = " << fdata.size() << endl;
  93.     vector<float> fdata_bak(fdata.size() * 2);    ///< size是10
  94.     vector<float>::iterator fdataIt = copy(fdata.begin(), fdata.end(), fdata_bak.begin());
  95.     ///< 追加
  96.     copy(fdata.begin(), fdata.end(), fdataIt);
  97.     //SHOW_VECTOR(float, fdata);
  98.     SHOW_VECTOR(float, fdata_bak);
  99.     ///< merge... set_union【返回合并后目标容器的最后一个数据的迭代器】... set_difference...
  100.     ///< transform【不仅拷贝,还增加了一个函数参数【更改将移动的数据】】...
  101.     /*
  102.     * author tujiaw
  103.     template < class InputIterator, class OutputIterator, class UnaryOperator >
  104.     OutputIterator transform ( InputIterator first1, // 源容器的起始地址
  105.     InputIterator last1, // 源容器的终止地址
  106.     OutputIterator result, // 目标容器的起始地址
  107.     UnaryOperator op ); // 函数指针
  108.     // typedef 目标容器元素类型 (*UnaryOperator)(源容器元素类型);

  109.     template < class InputIterator1, class InputIterator2,
  110.     class OutputIterator, class BinaryOperator >
  111.     OutputIterator transform ( InputIterator1 first1, // 源容器1的起始地址
  112.     InputIterator1 last1, // 源容器1的终止地址
  113.     InputIterator2 first2, // 源容器2的起始地址,元素个数与1相同
  114.     OutputIterator result, // 目标容器的起始地址,元素个数与1相同
  115.     BinaryOperator binary_op ); // 函数指针
  116.     // typedef 目标容器元素类型 (*BinaryOperator)(源容器1元素类型,源容器2元素类型);
  117.     */

  118.     /************************************************************************/
  119.     /* @brief Explain
  120.     vector的reserve和resize
  121.     Posted on 2011-05-16 19:42 李大嘴

  122.     vector 的reserve增加了vector的capacity,但是它的size没有改变!而resize改变了vector的capacity同时也增加了它的size!
  123.     原因如下:
  124.     reserve是容器预留空间,但在空间内不真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素。加入新的元素时,要调用push_back()/insert()函数。

  125.     resize是改变容器的大小,且在创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。此时再调用push_back()函数,是加在这个新的空间后面的。

  126.     两个函数的参数形式也有区别的,reserve函数之后一个参数,即需要预留的容器的空间;resize函数可以有两个参数,第一个参数是容器新的大小, 第二个参数是要加入容器中的新元素,如果这个参数被省略,那么就调用元素对象的默认构造函数。下面是这两个函数使用例子:
  127.     例子1:
  128.     vector<int> myVec;
  129.     myVec.reserve( 100 ); // 新元素还没有构造,
  130.     // 此时不能用[]访问元素
  131.     for (int i = 0; i < 100; i++ )
  132.     {
  133.     myVec.push_back( i ); //新元素这时才构造
  134.     }
  135.     myVec.resize( 102 ); // 用元素的默认构造函数构造了两个新的元素
  136.     myVec[100] = 1; //直接操作新元素
  137.     myVec[101] = 2;
  138.     例子2:
  139.     #include <vector>
  140.     #include <iostream>
  141.     using namespace std;

  142.     int main(int argc, char* argv[])
  143.     {
  144.     vector<int> vect;

  145.     vect.push_back(1);
  146.     vect.push_back(2);
  147.     vect.push_back(3);
  148.     vect.push_back(4);
  149.     vect.reserve(100);
  150.     cout<<vect.size()<<endl; //size为4,但是capacity为100
  151.     int i = 0;
  152.     for (i = 0; i < 104; i++)
  153.     {
  154.     cout<<vect[i]<<endl;
  155.     }
  156.     return 0;
  157.     }
  158.     例子3:
  159.     #include <vector>
  160.     #include <iostream>
  161.     using namespace std;

  162.     int main(int argc, char* argv[])
  163.     {
  164.     vector<int> vect;
  165.     vect.push_back(1);
  166.     vect.push_back(2);
  167.     vect.push_back(3);
  168.     vect.push_back(4);
  169.     vect.resize(100); //新的空间不覆盖原有四个元素占有的空间,现在size和capacity都是100
  170.     cout<<vect.size()<<endl;
  171.     int i = 0;
  172.     for (i = 0; i < 104; i++)
  173.     {
  174.     cout<<vect[i]<<endl;
  175.     }
  176.     return 0;
  177.     }
  178.     例子4:
  179.     #include <vector>
  180.     #include <iostream>
  181.     using namespace std;

  182.     int main(int argc, char* argv[])
  183.     {
  184.     vector<int> vect;
  185.     vect.resize(100); //分配100个空间
  186.     vect.push_back(1);
  187.     vect.push_back(2);
  188.     vect.push_back(3);
  189.     vect.push_back(4);
  190.     cout<<vect.size()<<endl; //现在size和capacity都是104
  191.     int i = 0;
  192.     for (i = 0; i < 104; i++)
  193.     {
  194.     cout<<vect[i]<<endl;
  195.     }
  196.     return 0;
  197.     }
  198.     从上面例子可以看出,不管是调用resize还是reserve,二者对容器原有的元素都没有影响。 */
  199.     /************************************************************************/

  200.     /**
  201.     * 容器排序
  202.     */
  203.     class Rect
  204.     {
  205.     public:
  206.         Rect(double dw) : m_dw(dw)
  207.         {

  208.         }
  209.         bool operator < (const Rect & rRectorOther)
  210.         {
  211.             return m_dw < rRectorOther.m_dw;
  212.         }
  213.     public:
  214.         double m_dw;
  215.     };
  216.     ///< 自定义比较规则、比void sort(RanIt first, RanIt last, Pred pr);要复杂点
  217.     vector<Rect> dbdata;
  218.     dbdata.push_back(Rect(4.5));
  219.     dbdata.push_back(Rect(5.6));
  220.     dbdata.push_back(Rect(2.3));
  221.     sort(dbdata.begin(), dbdata.end());
  222.     vector<Rect>::iterator itRe = dbdata.begin();
  223.     cout<<(*itRe).m_dw << ' '<<endl;

  224.     /**
  225.     * STL - find_if:bind1st:bind2nd【ptr_fun、mem_fun_ref、mem_fun】
  226.     * for_each参数与函数指针或函数对象参数要匹配.....?
  227.     */
  228.     // find_if example
  229.     std::vector<int> myvector;

  230.     myvector.push_back(10);
  231.     myvector.push_back(25);
  232.     myvector.push_back(40);
  233.     myvector.push_back(55);
  234.     ///< 返回指向第一个元素迭代器。如果找到最后也找不到符合要求的,则返回最后指向最后一个元素的迭代器.
  235.     std::vector<int>::iterator itf = std::find_if (myvector.begin(), myvector.end(), IsOdd);
  236.     std::cout << "The first odd value is " << *itf << '\n';
  237.     //比较高级点的 http://www.cnblogs.com/wengzilin/archive/2012/10/20/2732252.html

  238.     /*?????
  239.      * bind1st bind2nd ...
  240.      * http://blog.csdn.net/ych1/article/details/1430419
  241.      */
  242.     list<int *> widgetPtrs;
  243.     int la = 3;
  244.     widgetPtrs.push_back(&la);
  245.     list<int *>::iterator lit = widgetPtrs.begin();
  246.     widgetPtrs.insert(++lit, 4);
  247.     //list<int*>::iterator il = find_if(widgetPtrs.begin(), widgetPtrs.end(), not1(isInteresting)); //not ptr_fun是将一个普通的函数适配成一个functor,添加上argument type和result type等类型
  248.     list<int*>::iterator ill = find_if(widgetPtrs.begin(), widgetPtrs.end(), not1(ptr_fun(isInteresting)));

  249.     getchar();
  250.     return 0;
  251. }

  252. void printName(pair<int, string> it)
  253. {
  254.     cout << it.first << endl;
  255.     cout << it.second << endl;
  256. }

  257. void printName2(int it)
  258. {
  259.     cout << it << endl;
  260. }


阅读(2503) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~