-
// 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;
-
}
阅读(2466) | 评论(0) | 转发(0) |