05-51cto-堆和适配器

1、堆 heap make_heap(v.begin(),v.end()) 构造堆 默认大根堆 make_heap(v.begin(),v.end(),greater<int>()) 构造小根堆 放入一个元素到堆中,使其依然是一个堆 v.push_back() push_heap(v.begin(),v.end(),greater<int>()) pop_heap 出堆 将堆顶的元素移除 pop_heap(v.begin(),v.end(),greater<int>()) v.pop_back() sort_heap(v.begin(),v.end(),greater<int>()) 将容器元素从大到小排序,破坏堆结构2、adapter 适配器 本质是自定义的方法 reverse_iterator 逆向迭代器 反向迭代器方向的迭代适配器 reverse_iterator< vector<int>::iterator > rit(v.end()) cout<< *rit << endl; ++rit; front_insert_iterator 前插迭代器 以迭代器的使用方式实现,在容器开头插入元素 deque<int> d={1,2,3} 因为vector 没有push_front 所以不能用vector front_insert_iterator< deque<int> > fit(d); *fit =11; 头部插入 元素11 back_insert_iterator 后插迭代器 以迭代器的使用方式实现,在容器末尾位置插入元素 insert_iterator 插入迭代器 以迭代器使用方式实现,在容器的某位置插入元素 insert_iterator< vector<int> > fit(v,v.begin()+2) *fit=11 在第二个位置插入11 istream_iterator 输入流迭代器 以迭代器的使用方式实现 cin>> 的功能 istream_iterator<int> itEnd; istream_iterator<int> it(std::cin); 以空格键区分元素 int num1 = *it; ++it; int num2 = *it; ostream_iterator 输出流迭代器 以迭代器的使用方式实现 cout<< 的功能3、萃取:iterator_traits vector<int>::iterator::value_type vector<int>::iterator::iterator_category vector<int>::iterator::pointer vector<int>::iterator::difference_type vector<int>::iterator::reference4、type_traits is_void<void>::value 判断是否是 void is_void<int>::value 判断int 是否为void类型 is_void<void *>::value 判断vlid * 是否是void类型 is_pointer<int *>::value 判断 int * 是否是指针类型 is_function<decltype(fun)>::value 是否是函数类型 is_array<int[3]>::value 是否是数组 is_base_of<a,b>::value a是否是b的基类 is_object<int>::value 是否是类5、空间配置器 allocator allocator<int> allo; 定义空间配置器 int *p = allo.allocate(1); 定义1个空间 allo.contstruct(p,1); 给空间赋初值 1 cout << *p << endl; 使用 allo.address(*p); 获取地址 allo.deallocator(p,1); 回收值为1的空间 allo.destroy(p)

04-51cto-算法

#include<algorithm>文档地址https://cplusplus.com/reference/algorithmvector<int> v;1、findvector<int>:iterator it=find(v.begin(),v.end(),3) 从开始到结尾查找值为3 的迭代器2、find_if2.1、bool is3(int x){ return x==3;}vector<int>::iterator it = find_if(v.begin(),v.end(),is3) ;会将begin到end的元素一个一个传入方法is3里2.2、struct is3(){ bool operator ()(int x){ return x==3; }}vector<int>::iterator it = find_if( v.begin(),v.end(),is3() );3、find_first_if(v.begin(),v.end(),v2.begin(),v2.end()))4、for_each(v.begin(),v.end(),fun) 将每个元素一次作为参数传入到一元函数fun遍历5、count(v.begin(),v.end(),2) 返回2出现的次数6、count_if(v.begin(),v.end(),fun)7、vector<int>::iterator it = search(v.begin(),v.end(),v2.begin(),v2.end())8、search_n(v.begin(),v.end(),2,4) 查找连续的两个49、random_shuffle(v.begin(),v.end()) 打乱顺序10、replace(v.begin(),v.end(),3,333) 将所有元素3 替换成33311、replace_if(v.begin(),v.end(),fun,333) 一次传入fun 返回true的元素替换成33312、replace_copy(v.begin(),v.end(),v2.begin(),3,333) 将所有元素copy到v2并将3替换成33313、fill(v.begin(),v.end(),111) 将容器v每个元素设置为11114、vector<int>::iterator it = remove(v.begin(),v.end(),3) 移除元素3,并将删除的元素的后边元素前移不改变容器大小 返回最后一个元素位置15、reverse(v.begin(),v.end()) 反转元素顺序16、unique(v.begin(),v.end()) 删除连续重复元素17、transform( v.begin(),v.end(),v2.begin(),fun) 经fun加工后的元素返回给v2划分、排序18、partition(v.begin(),v.end(),fun) 分区 将fun返回true 的放到前边,为false 的放到后边19、stable_partition(v.begin(),v.end(),fun)20、sort(v.begin(),v.end(),greater<int>()) 降序排列; 第三个参数可以不传,默认为less 升序21、stable_sort(v.begin(),v.end(),greate<int>()) 有重复的元素会有作用22、partial_sort(v.begin(),v.begin()+3,v.end(),greater<int>()) 将最大的前三个排序放到最前,其他忽略排序23、nth_element(v.begin(),v.begin()+3,v.end()) 把第n大的元素拍到第n个位置,不关心其他元素

08-boost-时间库

#include<boost/date_time/gregorian/gregorian.hpp>using namespace boost::gregorian;#pragma comment(lib,"libboost_date_time-vc141-mt-gd-x32-1_67.lib")1、构造日期 date d1(2022,2,2); date d2=from_string("2022-02-02"); date d3=from_string("2022/02/02") date d4 = from_underlimited_string("20220202"); date d5(min_date_time) date d5(max_date_time) cout << d1.year()<<(int)d1.month() << d1.day()<<endl; cout << to_simple_string(d2) to_iso_string(d3) to_iso_extended_string(d4) date today = day_clock::local_day() 获取当天日期 today.year() today.month() today.day() today.day_of_week() today.week_number() 一年中的第几周 today.day_of_year() 一年中的第几天 today.end_of_month() 这个月的结束日期 days d(1) months m(1) date d10(2022,02,02); cout<< to_iso_extended_string( d10+days(-10) ) << endl;2、date_period date d1 = date(2022,1,1) date d2 =date(2022,9,9) date_period dp1(d1,d2); cout << "日期范围" << dp1 <<endl; cout << "这个范围天数" << dp1.length() << endl; date_period dp2(d1,date_duration(30)) cout << "日期范围"<< dp2 << endl; dp1.shift(days(3)) cout << "日期范围后移3天" << dp1 << endl; dp2.expand(days(1)) cout << "日期范围向两边阔1天" << dp2 << endl; cout << "日期范围是否包含" << dp1.contains(date(2022,2,2)) <<endl; day_iterator it1(d2); 默认步长为1 day_iterator it1(d2,10); 步长为10天 ++it1; cout << *it1 <<endl; week_iterator month_iterator year_iterator3、ptime #include<boost/date_time/posix_time/posix_time.hpp> using namespace boost::posix_time ptime p1 = time_from_string("2022-2-2 02:00:00") ptime p2 = from_iso_string("20030303T030000") ptime p3 = second_clock::local_time() 本地当前时间 秒精度 ptime p4 = microsec_clock::universal_time(); UTC当前时间,微秒精度 ptime p5(min_date_time) ptime p6(max_date_time)4、获取当前格式化时间 date d1 = day_clock::local_day(); date_facet *pdf = new date_facet("%Y-%m-%d %H:%M:%S "); cout.imbue( locale(cout.getlocl(),pdf) ) cout << d1 << endl; 输出2022-09-13 12:01:01

02-51cto-STL六大组件

3、STL 六大组件 container 容器 3.1、序列容器: array vector、deque、list、forward_list、stack、queue、priority_queue 3.2、关联容器 set、map、multiset、multimap、unordered_set、unordered_map、unordered_multiset、unordered_multimaptype_id(vetor<int>::iterator::iterator_category).name() 获取迭代器类型4 动态数组: 4.1 vector<int> v; v.capacity(); 容量大小 v.size() 元素数量 v.push_back(1); 在末尾添加1 v.insert(v.begin(),3);在前面插入 元素3 v.insert(v.end(),2,5) ; 在末尾插入两个5 v.pop_back();删除最后一个元素 v.erase(v.end()-1);删除最后一个元素 v.srase(v.begin()) ; 删除第一个元素 v.clear(); 清除所有元素,但不会清除容量 v.front() 第一个元素 v.back() 最后一个元素 v.at(key) 索引为key的元素 4.2 deque<int> d; 双向迭代器 d.push_front(1) 在头部插入 元素1 vector 没有此方法 d.pop_front() 从头部删除元素, vector 没有此方法 其他方法同vector 4.3 list<int> l; 双向迭代器;不支持索引访问元素 迭代器不支持 +n -n l.front() 返回第一个元素 .lback() 返回最后一个元素 其他方法同deque 4.4 #include<forward_list> forward_list 单向迭代器 没有rbegin() 和rend();支持++ 不支持-- 支持push_front() 不支持push_back() 支持insert_after() 4.5 栈 stack<int> s; 先进后出 不支持 索引访问元素;没有迭代器 s.push() s.pop() 删除栈顶元素 s.top() 栈顶元素 s.empty() 4.6 队列 #include<queue> queue<int> q; 先进先出,没有迭代器 双端队列 q.front() 队列头元素 q.back() 队列未元素 q.pop() 4.7 #include<queue> priority_queue<int> pq 优先队列 没有迭代器 不支持front() back() pq.top() 默认先出值最大的 pq.push(1) pq.push(3) pq.push(2) 默认顺序是 3,2,1 修改默认顺序 less priority_queue<int vector<int>,greater<int>> pq 4.8 set 集合 set<int> s; 不支持索引访问元素 默认升序排列 元素不允许重复,元素不可更改 set<int greater<int>> s;降序排列 s.insert(1) 插入元素 s.insert(1) 第二次插入会失败 s.insert(1).sencond 返回1说明插入成功,0说明插入失败 s.insert(v.begin(),v.end()) 插入其他容器 s.erase(1) 删除值为1的元素 s.erese(s.begin()) s.erese(s.begin(),s.end()) s.clear() 清空 set<int>::iterator it = s.find(9) 查找返回迭代器 if(it!=s.end()){找到} 4.9 map 关联容器 map<int,string> m; 值是 pair类型 4.9.1 pair数据 pair<int, char> p(1,"a"); 或make_pair(2,"b) make_pair 会自动推导数据类型 p.first 是1 即索引, p.second 是值 即 a m.insert(pair<int,string>(2,"bb")) 插入 已存在key 无法插入 m.insert(make_pair(3,"cc")) 插入 已存在key 无法插入 m[5] = "dd" 插入 已经存在的修改 m.erase(3) 删除key为3的元素 m.erase(m.begin()) for(map<int,string>::iterator it=m.begin();it!=m.end();it++){ cout<<"索引:"<< it->first << "值:"<<it->second<<endl; } map<int,string>::iterator it=m.find(3) if(it!=m.end()){ 找到索引为3的元素 it->first it->secnod.c_str() 转换成string } cout<< m[33]..c_str() << endl; 如果没有索引为33 会插入,索引判断是否存在要用find 4.10 multiset 集合,与set的区别是允许元素重复 #include<set> m.find(1) 只能找到 第一个,返回迭代器 pair<multiset<int>::iterator,multiset<int>::iterator> pa=s.equal_range(1) 找到所有值为1 的元素,返回值为1 的第一个到走后一个的迭代器 for(multiset<int>::iterator it=pa.first;it!=pa.second;it++){ cout<< *it <<endl; } 或 auto pa=s.equal_range(1) for(auto it=pa.first;it!=pa.second;it++){ cout<< *it <<endl; } 4.11 multimap 允许key重复的map multimap<int,string> mm; 不可以使用mm[key] 因为key是可以重复的 auto pa = mm.equal_range(1) for(auto it==pa.first;it!=pa.second;it++){ cout<< it->first<<it->second.c_str() <<endl; } 4.12、 unordered_set 元素值唯一、无序的set 没有反向遍历reverse_iterator 4.13、unordered_map 元素索引唯一,无序的map 4.14 、unordered_nultiset 元素值不唯一, 无序的set 4.15、unordered_multimap 元素索引不唯一,无序的map

06-boost

www.boost.org1、c++类型转换 atof() 将字符串转换为双精度浮点型值 atoi() 将字符串转换成整型 atol() 将字符串转换成长整型 itoa() 将字符串转为整形 gcvt() 将浮点数转换成字符串 取四舍五入2、boost 库 include<boost/lexical_cast.cpp> using boost::lexical_cast; int a = lexical_cast<int>("123"); 字符串转正行 float b = lexical_cast<loat>("1.2345"); string c = lexical_cast<string>(666)3、format include<boost/format.hpp> using boost::format format fmt("d %2% d %1% aaaaaa %2% !!! "); fmt% 123; fmt% abc; 等价于printf("dd %d aaaaaa%s", 123,"abc");4、string_algo 库 include<boost/algorithm/string.hpp> to_upper("abc"); 转换成大写 改变原字符串 string str2 = to_upper_copy("abc") 转换成大写 不改变原字符串 to_lower("ABC"); 转换成小写 改变原字符串 starts_width("hello word","he") 检测是否是另一字符串的前缀 ends_width 检测是否是另一字符串的后缀 contains 检测是否包含另一字符串 equals 检测两字符串是否相等 lexicographical_compare 根据字典顺序检测一字符串是否小于另一个 all 检测一个字符串中的所有元素是否满足指定判断式 istart_width 忽略大小写, 检测是否是另一字符串的前缀 cout << is_equal()("abc","abc") << endl; is_less()("abc","abc") is_not_greater()("abc","abc") is_space 字符是否为空 is_alnum 字符是否为字母数字字符 is_appha 字符是否为字母 is_cntrl 字符是否为控制字符 is_digit 字符是否为十进制数字 is_lower 字符是否为小写字符 is_punct 字符是否为标点符号字符 is_upper 字符是否为大写字符 is_xdigit 字符是否为十六进制数字 is_any_of 字符是否为参数字符序列中的任意字符 修剪 trim trim_right trim_left trim_copy trim_if trim_copy_if 查找 find_first(str,"hello") 查找字符串第一次在被查找串中出现的位置 ifind_first 忽略大小写 find_last 查找子串最后一次在查找串中的位置 find_nth 查找子串第n此出现在被查找串中的位置 find_head 返回字符串头部n个字符串的位置 find_tail 返回字符串尾部n个字符串的位置 string str="Hello,hello,hello,Boost!!!" iterator_range<string::iterator> rge; rge= find_first(str,"hello") 查找字符串第一次在被查找串中出现的位置 rge.begin() - str.begin() 返回起始索引值 rge.end() - str.begin() 返回查找字符串在被查找字符传中的结束位置 删除替换 replace/erase_first 替换/删除第一次出现在被查串中的子串 replace/erase_last 替换/删除走后一次出现在被查串中的子串 replace/erase_nth 替换/删除第n次出现在被查串中的子串 replace/erase_all 替换/删除所有子串 replace/erase_head 替换/删除头部几个字符串 没有i replace/erase_tial 替换/删除尾部几个字符 没有i 切割字符串:split list<string> lst; split(lst,str,if_any_of("*")) ; 以*分割 并赋给l for(auto e:lst){ cout << e << endl; } 循环等价于 for(list<string>::iterator it = lst.begin();it!=lst.end();it++){ cout << *it <<endl; } 连接字符串 string str = join(v,"="); 用等号连接容器中的元素 返回字符串 join_if(v,"=",fun); 容器元素符合方法 fun的元素用等号连接成字符串

bilibili 学习笔记

平台bilibili知识点:class指针模板STL标准库string容器vector内置方法#pragra once; 防止重 includesystem("pause") 按任意继续system("cls") 清屏int numcin>>num 输入exit(0) 退出整个程序堆区创建数据 返回指针int *p = new int(10) 初始化值为10delete p ;释放堆区内存int *p = new int[10] 数组delete [] p;赋值拷贝class Person{ Person(const Person *p);//赋值拷贝构造函数 Person & operator=(const Person& p) // operator 防止浅拷贝 public: string name;}Person a;Person b = a; //赋值拷贝继承 private成员不可继承class B:Public A{} B继承A A的public、protected 成员不变class B:prottected A{} B继承A A的成员在B中是protectedclass B:private A{} B继承A A的成员在B中是privateclass B:virtual public A{} 虚继承,解决菱形继承的结成数据冲突多态 virtualclass animal{ virtual void speck(){ 虚函数, 调用&animal时会被覆盖 cout << " a speck" << endl; } virtual int ask()=0; 纯虚函数;有纯虚函数的类不可以实例化}class cat:public animal{ void speck(){ cout << " b speck" << endl; }}调用function speck(animal &animal){ animal.speck();}cat c;speck(c)父speck 没有 virtual 输出 a speck,父方法有virtual 输出 b speck文件读写引用头文件#include <fstream>ofstream 写操作ifstream 读操作fstream 读写操作ios::in 打开要读取的文件ios::out 打开要写入的文件ios::binary 以二进制模式打开文件ios::app 打开文件在末尾附加新信息ios::ate 打开并将空间移动到文件末尾ios::trunc 删除现有文件中的数据ios::nocreate 尽在文件已存在是打开文件ios::noreplace 尽在文件不存在时打开文件写文件fstram fs;fs.open("test.txt",ios::out|ios::binary);fs<< "内容" <<endl;fs.close();二进制方式写文件fstream fs("test.txt",ios::out|ios::binary)或fstram fs;fs.open("test.txt",ios::out|ios::binary);Person zhangsan = {"张三",18}fs.write((const char *)&zhangsan,sizeof(张三));fs.close();读二进制文件ifstream ifs;ifs.open("text.txt",ios::in|ios::binary);if(!ifs.is_open()){ return ;}Person p;ifs.read((char *)&p,sizeof(p));ifs.close();fstream fs;fs.open("text.txt",ios::in);if(!fs.is_open){ cout << "文件不存在"<<endl;}char ch; //定义一个字符,读取一个字符就到了末尾标志eof 说明是空文件fs>>ch;if(fs.eof){cout << "文件存在但为空"<<endl;} ** 问题不懂可以多看几遍 p154 Work ** Emplor = new Work *[5] delete [] Emplor;switch case里如果代码太多没有{} 会报错switch(type) case 1: { break; } 模板template<typename T> 或 template<class T> //自定义数据类型 T使用方法1、自动类型推导mySwap(a,b);2、显示指定类型mySwap<int>(a,b);void mySwap(T &a,T &b){ 逻辑实现}template<class T>void swap() //swap 方法里要用到自定义模板{}类模板template<typaname tname,typename tage>class Person{public: tname name; tage age; Person(tname nm,tage ag){ name=nm; age = ag; }}调用Person<string,int> p1("张三",18);template<typaname tname,typename tage=int> 默认tage是int类型查看类型typeid(T1).name(); 查看T1类型类模板与友元一、类内实现template<class T1,class T2>class Person{ friend void printPerson(Person<T1,T2> &p){ //逻辑实现 }; public: T1 name; T2 age;}二、类外实现1、template<class T1,class T2>class Person;2、template<class T1,class T2>void printPerson(Person<T1,T2> &p){}3、template<class T1,class T2>class Person{ friend void printPerson<>(Person<T1,T2> &p); // <>至关重要 public: T1 name; T2 age;}STL六大组件1、容器:如:vector、deque、stack、list、set、map等2、算法:如sort、find、copy、for_each #include <algorithm>3、迭代器:扮演了容器与算法之间的胶合剂4、仿函数:行为类似函数,可作为算法的某种策略5、适配器:一种永凯修饰容器或者仿函数或迭代器接口的东西6、空间配置器:负责空间的配置与管理vector#include <vector>#include <algorithm> 标准算法头文件vector<int> v;v.push_back(10);v.push_back(20); ……遍历方法一vector<int>::iterator itBegin = v.begin();vector<int>::iterator itEnd = v.end();while(itBegin!=itEnd){ cout << *itBegin << endl;}遍历方法二for(vector<int>::iterator it=v.begin();it!=v.end();it++){ cout << *it << endl;}遍历方法三void myPrint(int val){ cout<< val << endl;}for_each(v.begin,v.end,myPrint)vector<int> v;v.empty() 判断是否为空 返回true 或falsev.capacity() 获取容器容量 v.size() 获取容器数据个数v.resize(num) 重新指定容器容量,如果变小,最后的元素会被删除v.resize(num,ele) 重新指定容器容量大小,如果边长则以ele填充v.push_back(ele) 尾部添加v.pop_back() 删除最后一个v.clear() 删除容器中所有元素v.insert(v.begin(),2,100); 在容器前边插入两个100 迭代器插入v.erase(v.begin()) 删除容器第一个元素v[i] 也可以用v.at(i)v.front() 返回第一个元素v.back() 返回最后一个元素v1.swap(v2) v1 与 v2 交换vector<int>(v).swap(v) 内存收缩v.reserve(num) 预留空间string赋值string str = ""string str.assign("");string 拼接string str+=""string str.append("")string查找find() rfind()string 替换replace(int,int,string)字符串比较int res = str1.compare(str2) res==0 两字符串相等res>0 str1 > str2res<0 str1 < str2string 插入str.insert(1,"aaa") 在str 第1个位置插入 aaastring 删除str.erase(1,3) 从第一个位置开始,擦除3个字符字符串截取str.substr(1,3) #include <deque>deque 与vector的区别vector 对于头部插入删除效率低,,数据量越大,效率越低deque 相对而言,对头部的插入删除速度会比vector快vector访问元素的速度会比deque快,这和两者内部实现有关deque<int> d; d.push_front(ele) 头部添加元素 vector 没有 d.pop_front() 头部删除元素 vector 没有 d.push_back(ele) 尾部添加元素 d.pop_back() 尾部删除元素 iterator 或const_iterator#include <algorithm>sort(d.begin(),d.end()) 默认升序排列随机数种子#include <ctime>srand( (unsigned int)time(NULL) )stack 容器先进后出,不可遍历stack<int> s;s.empty() 判断是否为空s.push(ele) 入栈s.top(); 获取栈顶元素s.pop(); 出栈 删除顶部元素queue 容器先进先出 不可遍历queue<int> q;q.push(ele) 在队尾添加元素q.pop() 从对头移除第一个元素q.back() 返回最后一个元素q.front() 返回第一个元素list 容器#include <list> list <int> lst; lst[0] 错误,不可以用[索引] 访问 也不可已用 at(索引)访问lst.push_back();list<int> l2(lst.begin(),lst.end()); 构造l2.assign(lst.begin(),lst.end);list<int> l3(l2); 构造l3.assign(l2);list<int> l4(10,100); 构造,创建10 值为100的元素方法同dequelst.push_back(ele)lst.pop_back()lst.push_front(ele)lst.pop_front()lst.insert(pos,ele)lst.insert(pos,n,ele)lst.insert(pos,begin,end)lst.clear()lst.erase(begin,end)lst.erase(pos)附加方法lst.remvoe(ele) 删除值为ele的所有元素lst.front() 返回第一个元素lst.back() 返回最后一个元素lst.reverse() 翻转 ,收尾对调lst.sort() 排序 默认升序排列 注:vector 是 sort(v.begin(),v.end()) bool mysort(int a,int b){ return a>b; //降序排列 return a<b; //升序排列} lst.sort(mysort)list<int>::iterator it = lst.begin()it++ 可以it+=1 或it = it+1 不不不可以set/multiset 容器set 不允许有重复元素,插入数据会自动排序multiset 允许有重复元素#include <set>插入数据只有insertset<int>s;s.insert(10) 不可用push_back(ele)set<int> s2(s) 拷贝构造set<int> s3=str2 复制拷贝s.erase(s.begin())s.erase(30) 将值为30的元素删掉,相当于list中的removeset<int>::iterator pos = s.find(ele)if(pos!=s.end()){有}int num = count(ele) 对于set 返回结果只有0或1,<!-- 指定排序规则 仿函数-->class mysort{ public: bool operator()(int v1,int v2){ // 重定义() return v1>v2; }}set<int,mysort> s;s.insert(10)s.insert(20)for(set<int,int,mysort>::iterator it =s.begin();it!=s.end();it++){ cout<< (*it) << endl;}pair 对组数据pair<string,int>p("tom",20);或pair<string,int>p = make_pair("tom",20);cout<< "姓名:"<<p.first << "年龄:" << p.second<<endl;map /mutimap 容器#include<map>所有元素都是pairpair中一个元素为key,启动索引作用,第二个元素为value 实值所有元素都会根据key值自动排序map不允许有重复key,mutimap允许有重复keymap<int,int> m;m.insert(pair<int,int>(1,10)) 插入方法一m.insert(make_pair(2,10)) 插入方法二m.insert(map<int,int>::value_type(3,30)) 插入方法三m[4] = 40 插入方法四for(map<int,int>::iterator it = m.begin();it!=m.end();it++){ cout<< "key="<<(*it).first << " value = " << it->second<<endl;}m.erase(m.begin()) 删除第一个元素m.erase(3) 删除key 为3 的元素map<int,int>::iterator it= m.find(key) 查找if(it!=m.end()){找到}int num = count(key)自定义排序规则同setfind_if();class GreatFive{ public: bool operator()(int val){ return val>5; }}vector<int>::iterator it = find_if(v.begin(),v.end(),GreatFive())if(it!=v.end()){ "有大于5的数"}sort() // 默认正序class MySort{ public: bool operator()(int a,int b){ return a> b; }}vector<int> v;sort(v.begin(),v.end()) 升序sort(v.begin(),v.end(),MySort) 降序排列#include <functional> // 内置仿函数一、运算仿函数plus 加法minus 减法multiplies 乘法divides 除法modulus 取模megate 取反negate<int> n; 取反n(50) 返回-50plus<int> p; 相加 p(10,20) 返回30二、关系仿函数equal_to 等于not_equal_to 不等于greater 大于greater_equal 大于等于less 小于less_equal 小于等于sort(v.begin(),v.end(),greater<int>()) greater 是自带的三、逻辑仿函数logical_andlogical_orlogical_not vector<bool> v1; v.push_back(true) v.push_back(false) v.push_back(true) v.push_back(false)vector<bool> v2;v.resize(v1.size()) //搬运必须小开辟空间transform(v1.begin(),v1.end(),v2.begin(),logical_not<bool>()) v1元素取反付给v2常用算法#include <algorithm> for_each transform<!-- 普通函数定义 -->void bianli1(int val){ cout << val << endl;}<!-- 仿函数定义 -->class bianli2{ public: void operato ()(int val){ cout << val << endl; }}vector<int> v;for_each(v.begin(),v.end(),bianli1) 普通函数遍历for_reach(v.begin(),v.end(),bianli2()) 仿函数遍历transform 搬运 即将 v1的值搬运给v2class yunsuan{ public: int operator ()(int){ return int+1000 }}vector<int> v1;vector<int> v2;v2.resize(v1.size())transform(v1.begin(),v1.end(),v2.begin(),yunsuan())常用的查找算法find 查找元素find_if 按条件查找元素adjacent_find 查找相邻重复元素 返回相邻重复元素第一个元素迭代器binary_search 二分查找法 返回bool 容器必须是有序的count 统计元素个数count_if 按条件统计元素个数vector<int>::iterator it = find(v.begin(),v.end(),val) 返回迭代器find 查找自定义类型数据class Person{ public: Person(string name,int age){ this->m_name = name; this->m_age = age; } <!-- 重载 == 使底层知道如何对比自定义数据类型person --> bool operator == (Person &a,Person $b){ if(a.m_name==b.m_name && a.age==b.age){ return true; }else{ return false; } } string m_name; int age;}vector<Person> v;Person p("zhangsan",18)vector<Person>::iterator it = find(v.begin(),v.end(),p)if(it==v.end){未找到}vector<int>::iterator it = adjacent_find(v.begin(),v.end()); v必须是有序的bool has = binary_search(v.begin(),v.end(),val);int num = count(v.begin(),v.end(),val) 查找val个数统计自定义类型vector<Person> v;class Person{ public: Person(string name,int age){ this->m_name = name; this->m_age = age; } bool operator == (const Person &a){ if(this->age==a.age){ return true; }else{ return false; } } string m_name; int age;}Person p("赵云",35)int num = count(v.begin(),v.end(),p) 35岁的人的 个数常用的排序算法sortrandom_shuffle 洗牌,指定范围内的元素随机调整次序mergereverse常用的拷贝和替换算法copyreplacereplace_ifswap(v1,v2) 交换vector<int> v1;vector<int> v2;v2.resize(v1.size());copy(v1.begin(),v1.end(),v2.begin())replace(v.begin(),v.end(),oldValue,newValue)class MyGreater{ public: void operator()(int val){ return val>30 }}replace_if(v.begin(),v.end(),MyGreater(),500) 把大于30的元素都替换成500常用的算术生成算法#include <numeric>accumulate 计算容器元素累计总和fill 向容器中添加元素accumulate(v.begin(),v.end(),0) 返回容器元素的和fill(v.begin(),v.end(),100) 将容器中元素填充成100<!-- 常用的集合算法 -->set_intersection //求两个容器的交集set_union //求两个容器的并集set_difference //求两个容器的差集vector<int> targetV;targetV.resize(min(v1.size(),v2.size()))vector<int>::iterator itEnd = set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),targetV.begin())for_each(targetV.begin(),itEnd,Myprint) 用itEnd 是因为 targetV 的元素比resize()时定义的量要少vector<int> targetV;targetV.resize(v1.size()+v2.size())vector<int>::iterator itEnd = set_union(v1.begin(),v1.end(),v2.begin(),v2.end(),targetV.begin())for_each(targetV.begin(),itEnd,Myprint)targetV.resize(max(v1.size(),v2.size()))vector<int>::iterator itEnd = set_difference(v1.begin(),v1.end(),v2.begin(),v2.end(),targetV.begin())p250完

14-boost-解析XML文件

常用的XML解析器TinyXML: 是一个简单的开源的解析XML的解析库(DOM模型)RapidXml: 是一个使用c++ 编写的XML DOM 解析工具包,整个解析工具包包含在一个头文件中,搜易使用时不用编译也不用连接。只要包含rapidxml 中的三个头文件即可Xerces-C++:是Apache 组织所推动的一项XML 我都能当解析开源项目,通过DOM、SZX 等方式解析libXML:是一个用于解析xml文件的库,在各个平台下都有使用,也支持多种语言,如c、python 等; boost库中的property_tree 库是一个保存了多个属性的属性数据结构,可以很方便的解析或生成xml、json、ini、info、文件。property_tree库的核心类是 basic_ptree#include<boost/property_tree/ptree.hpp>#include < boost/property_tree/xml_parser.hpp>using namespace boost::property_tree;test.xml<stu> <name id="1000">小明<name> <age>18</age> <score>8.2</score> <lesson> <name>语文</name> <name>数学</name> </lesson></stu>ptree pt;read_xml("test.xml",pt);cout << pt.get<string>("stu.name") <<endl;cout << pt.get<string>("stu.name.<xmlattr>.id") <<endl;cout << pt.get<int>("stu.age") <<endl;cout << pt.get<double>("stu.score") <<endl;cout << pt.ge("stu.sex","保密") <<endl; 没有则设置默认值auto child = pt.get_child("stu.lesson");for(auto pos=child.begin();pos!=child.end();pos++){ cout << pos->first.data() << pos->second.data() <<endl;}

13-boost-散列容器

散列容器(has container)是一种非常重要的容器类型,他内部使用hash 散列表代替二叉树提供更高的访问效率,散列容器是无序的Boost unordered 库提供两个散列集合类 unordered_set 和 unordered_multiset、unordered_map、unordered_multimap 他们的使用方法接口和用法与STL的关联容器 set/map 相同,但查找的平均复杂度却由O(logN) 变成O(1),查找性更好#include<boost/unordered_set.hpp>unordered_set<string> us;us.inert("aa");us.inert("aa"); 重复元素无法插入set、unordered_set 比较 unordered_set 查找性能更好#include<boost/unordered_set.hpp>unordered_multiset<string> us;bimap #include<boost/bimap.hpp>map 和multimap都是但映射,只能通过key查找到value,但是实际项目开发中,有时也需要从value找到对应的key,boost的bimap便是这样一种双向映射容器,他要求key,value 都必须唯一bimap<int,string> bm;bm.left.insert(make_pair(1,"aaa"));bm.left.insrt(make_pair(1,"aaaaa)); 无效bm.right.insert(make_pair("ccc",2))bm.right.insert(make_pair("ccc",3)) 无效circluar_buffer #include<boost/circular_buffer.hpp>boost 库中的circular_buffer 顾名思义是一个循环缓冲器,其capcity 是固定的,当容器满了以后,插入一个元素时,会在容器的开头后结尾出删除一个元素。multi_array#include<boost/multi_array.hpp>boost库中的multi_array 是一个动态多维数组库,它实现了一个通用,与标准库的容器一直的接口,并且具有与c++ 中内建的多维数组一样的接口和行为int a = 2;int b = 3;int c = 4;multi_array<int 3> arr(extents[a][b][c])arr.shape()[0] arr.shape()[1] 获取对应维度的长度arr.num_elements() 获取元素总个数arr.resize(extents[4][5][6]) 改变各维度长度arr.reshape() 改变形状

15-boost-json

常用json解析器RapidJSON 是一个c++的小而全的json解析器及生成器。他的灵感来自RapidXml,他同时支持SAX 和DOM风格APIJsoncpp 是个跨平台的开源库,主要包含三种类型 class:Value、Reader、WritercJSON 是个超轻巧,单文件,可以作为ANSI-C标准的JSON解析器boost库里解析json#include<boost/property_tree/ptree.hpp>#include<boost/property_tree/json_parser.hpp>using namespace boost::property_tree;test.json 文件{ “stu":{ "name":"小明", "age":18, } "score":8.23, "lesson":[ "math", "english" ]}ptree ptread_json("test.json",pt);cout << pt.get<string>("stu.name") <<endl;cout << pt.get<string>("stu.name.<xmlattr>.id") <<endl;cout << pt.get<int>("stu.age") <<endl;cout << pt.get<double>("stu.score") <<endl;cout << pt.ge("stu.sex","保密") <<endl; 没有则设置默认值auto child = pt.get_child("stu.lesson");for(auto pos=child.begin();pos!=child.end();pos++){ cout << pos->first.data() << pos->second.data() <<endl;}解决中文乱码 ,先将test.json 保存为 utf-8编码格式中文转换#include<Window.h>string st r= pt.get("stu.name");int len = MultiByteToWideChar(CP_UTF8,NULL,str.data(),str.length(),0,0);wchar_t * pw = new wchar_t[len+1];MultiByteToWideChar(CP_UTF8,NULL,str.data(),str.length(),pw,len+1);pw[len] =L "\0";wcout.imbue(locale("",LC_CTYPE));wcout <<L"姓名"<< pw << endl;