点击(此处)折叠或打开
- // STL.cpp : 定义控制台应用程序的入口点。
- //
-
- #include "stdafx.h"
- #include <ctime>
- #include <cstdlib>
- #include <map>
- #include <string>
- #include <iostream> // std::cout
- #include <algorithm> // std::find_if
- #include <vector> // std::vector
- #include<list> // std::list
-
- using namespace std;
-
- /************************************************************************/
- /* <set>容器 模版<隐式申明、显示申明、正则表达式> count_if... */
- /************************************************************************/
-
- /************************************************************************/
- /* for_each调用函数【指针】 */
- /************************************************************************/
- static void printName(pair<int, string> it);
- static void printName2(int it);
- #define SHOW_VECTOR(T, vct) \
- for (vector<T>::iterator it = vct.begin(); it != vct.end(); ) \
- { \
- cout << *(it++) << endl;\
- }\
-
- bool IsOdd (int i) {
- return ((i%2)==1);
- }
-
- bool isInteresting(const int * pw)
- {
- return ((*pw % 2) == 0);
- }
-
- int _tmain(int argc, _TCHAR* argv[])
- {
- /**
- * Vector【注释释放容器元素后,元素会重新“凑紧“】
- */
- int i = 0, temp;
- vector<int> IntV;
- srand(unsigned(time(0)));
- for (i = 0; i < 10; ++i)
- {
- temp = rand()%10;
- IntV.push_back(temp);
- }
- vector<int>::iterator it;
- for (it = IntV.begin(); it != IntV.end(); ++it)
- {
- cout << *it << endl;
- }
- for (it = IntV.begin(); it != IntV.end(); )
- {
- if (*it < 2)
- {
- it = IntV.erase(it);
- }
- else
- {
- it++;
- }
- }
- cout << endl;
- for (it = IntV.begin(); it != IntV.end(); ++it)
- {
- cout << *it << endl;
- }
- ///< another function
- for_each(IntV.begin(), IntV.end(), printName2);
-
- /**
- * Map
- */
- map<int, string> kv;
- kv.insert(pair<int, string>(1, "大地"));
- kv.insert(map<int, string>::value_type(25, "gege"));
- kv[3] = "simi达";
-
- for (map<int, string>::iterator it = kv.lower_bound(1);
- it != kv.upper_bound(25); ++it)
- {
- cout << "当前号 " << it->first << endl;
- cout << "姓名 " << it->second << endl;
- }
- ///< another function
- for_each(kv.begin(), kv.end(), printName);
- ///< find... find_if... remove... replace_if...
-
- /**
- * 容器拷贝
- */
- vector<float> fdata;
- fdata.push_back(5.0);
- fdata.push_back(4.0);
- fdata.resize(10);
- cout << "fdata size = " << fdata.size() << endl;
- vector<float> fdata_bak(fdata.size() * 2); ///< size是10
- vector<float>::iterator fdataIt = copy(fdata.begin(), fdata.end(), fdata_bak.begin());
- ///< 追加
- copy(fdata.begin(), fdata.end(), fdataIt);
- //SHOW_VECTOR(float, fdata);
- SHOW_VECTOR(float, fdata_bak);
- ///< merge... set_union【返回合并后目标容器的最后一个数据的迭代器】... set_difference...
- ///< transform【不仅拷贝,还增加了一个函数参数【更改将移动的数据】】...
- /*
- * author tujiaw
- template < class InputIterator, class OutputIterator, class UnaryOperator >
- OutputIterator transform ( InputIterator first1, // 源容器的起始地址
- InputIterator last1, // 源容器的终止地址
- OutputIterator result, // 目标容器的起始地址
- UnaryOperator op ); // 函数指针
- // typedef 目标容器元素类型 (*UnaryOperator)(源容器元素类型);
-
- template < class InputIterator1, class InputIterator2,
- class OutputIterator, class BinaryOperator >
- OutputIterator transform ( InputIterator1 first1, // 源容器1的起始地址
- InputIterator1 last1, // 源容器1的终止地址
- InputIterator2 first2, // 源容器2的起始地址,元素个数与1相同
- OutputIterator result, // 目标容器的起始地址,元素个数与1相同
- BinaryOperator binary_op ); // 函数指针
- // typedef 目标容器元素类型 (*BinaryOperator)(源容器1元素类型,源容器2元素类型);
- */
-
- /************************************************************************/
- /* @brief Explain
- vector的reserve和resize
- Posted on 2011-05-16 19:42 李大嘴
-
- vector 的reserve增加了vector的capacity,但是它的size没有改变!而resize改变了vector的capacity同时也增加了它的size!
- 原因如下:
- reserve是容器预留空间,但在空间内不真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素。加入新的元素时,要调用push_back()/insert()函数。
-
- resize是改变容器的大小,且在创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。此时再调用push_back()函数,是加在这个新的空间后面的。
-
- 两个函数的参数形式也有区别的,reserve函数之后一个参数,即需要预留的容器的空间;resize函数可以有两个参数,第一个参数是容器新的大小, 第二个参数是要加入容器中的新元素,如果这个参数被省略,那么就调用元素对象的默认构造函数。下面是这两个函数使用例子:
- 例子1:
- vector<int> myVec;
- myVec.reserve( 100 ); // 新元素还没有构造,
- // 此时不能用[]访问元素
- for (int i = 0; i < 100; i++ )
- {
- myVec.push_back( i ); //新元素这时才构造
- }
- myVec.resize( 102 ); // 用元素的默认构造函数构造了两个新的元素
- myVec[100] = 1; //直接操作新元素
- myVec[101] = 2;
- 例子2:
- #include <vector>
- #include <iostream>
- using namespace std;
-
- int main(int argc, char* argv[])
- {
- vector<int> vect;
-
- vect.push_back(1);
- vect.push_back(2);
- vect.push_back(3);
- vect.push_back(4);
- vect.reserve(100);
- cout<<vect.size()<<endl; //size为4,但是capacity为100
- int i = 0;
- for (i = 0; i < 104; i++)
- {
- cout<<vect[i]<<endl;
- }
- return 0;
- }
- 例子3:
- #include <vector>
- #include <iostream>
- using namespace std;
-
- int main(int argc, char* argv[])
- {
- vector<int> vect;
- vect.push_back(1);
- vect.push_back(2);
- vect.push_back(3);
- vect.push_back(4);
- vect.resize(100); //新的空间不覆盖原有四个元素占有的空间,现在size和capacity都是100
- cout<<vect.size()<<endl;
- int i = 0;
- for (i = 0; i < 104; i++)
- {
- cout<<vect[i]<<endl;
- }
- return 0;
- }
- 例子4:
- #include <vector>
- #include <iostream>
- using namespace std;
-
- int main(int argc, char* argv[])
- {
- vector<int> vect;
- vect.resize(100); //分配100个空间
- vect.push_back(1);
- vect.push_back(2);
- vect.push_back(3);
- vect.push_back(4);
- cout<<vect.size()<<endl; //现在size和capacity都是104
- int i = 0;
- for (i = 0; i < 104; i++)
- {
- cout<<vect[i]<<endl;
- }
- return 0;
- }
- 从上面例子可以看出,不管是调用resize还是reserve,二者对容器原有的元素都没有影响。 */
- /************************************************************************/
-
- /**
- * 容器排序
- */
- class Rect
- {
- public:
- Rect(double dw) : m_dw(dw)
- {
-
- }
- bool operator < (const Rect & rRectorOther)
- {
- return m_dw < rRectorOther.m_dw;
- }
- public:
- double m_dw;
- };
- ///< 自定义比较规则、比void sort(RanIt first, RanIt last, Pred pr);要复杂点
- vector<Rect> dbdata;
- dbdata.push_back(Rect(4.5));
- dbdata.push_back(Rect(5.6));
- dbdata.push_back(Rect(2.3));
- sort(dbdata.begin(), dbdata.end());
- vector<Rect>::iterator itRe = dbdata.begin();
- cout<<(*itRe).m_dw << ' '<<endl;
-
- /**
- * STL - find_if:bind1st:bind2nd【ptr_fun、mem_fun_ref、mem_fun】
- * for_each参数与函数指针或函数对象参数要匹配.....?
- */
- // find_if example
- std::vector<int> myvector;
-
- myvector.push_back(10);
- myvector.push_back(25);
- myvector.push_back(40);
- myvector.push_back(55);
- ///< 返回指向第一个元素迭代器。如果找到最后也找不到符合要求的,则返回最后指向最后一个元素的迭代器.
- std::vector<int>::iterator itf = std::find_if (myvector.begin(), myvector.end(), IsOdd);
- std::cout << "The first odd value is " << *itf << '\n';
- //比较高级点的 http://www.cnblogs.com/wengzilin/archive/2012/10/20/2732252.html
-
- /*?????
- * bind1st bind2nd ...
- * http://blog.csdn.net/ych1/article/details/1430419
- */
- list<int *> widgetPtrs;
- int la = 3;
- widgetPtrs.push_back(&la);
- list<int *>::iterator lit = widgetPtrs.begin();
- widgetPtrs.insert(++lit, 4);
- //list<int*>::iterator il = find_if(widgetPtrs.begin(), widgetPtrs.end(), not1(isInteresting)); //not ptr_fun是将一个普通的函数适配成一个functor,添加上argument type和result type等类型
- list<int*>::iterator ill = find_if(widgetPtrs.begin(), widgetPtrs.end(), not1(ptr_fun(isInteresting)));
-
- getchar();
- return 0;
- }
-
- void printName(pair<int, string> it)
- {
- cout << it.first << endl;
- cout << it.second << endl;
- }
-
- void printName2(int it)
- {
- cout << it << endl;
- }
FROM: http://blog.chinaunix.net/uid-25799257-id-3585447.html