#include <stdio.h> #include <iostream>//cin,cout #include <sstream>//ss transfer. #include <fstream>//file #include "myclass.h" #include <list> #include <map> #include <vector> #include <algorithm> #include <memory> using namespace std; //list //assign() 给list赋值 //back() 返回最后一个元素 //begin() 返回指向第一个元素的迭代器 //clear() 删除所有元素 //empty() 如果list是空的则返回true //end() 返回末尾的迭代器 //erase() 删除一个元素 //front() 返回第一个元素 //get_allocator() 返回list的配置器 //insert() 插入一个元素到list中 //max_size() 返回list能容纳的最大元素数量 //merge() 合并两个list //pop_back() 删除最后一个元素 //pop_front() 删除第一个元素 //push_back() 在list的末尾添加一个元素 //push_front() 在list的头部添加一个元素 //rbegin() 返回指向第一个元素的逆向迭代器 //remove() 从list删除元素 //remove_if() 按指定条件删除元素 //rend() 指向list末尾的逆向迭代器 //resize() 改变list的大小 //reverse() 把list的元素倒转 //size() 返回list中的元素个数 //sort() 给list排序 //splice() 合并两个list //swap() 交换两个list //unique() 删除list中重复的元素 //vector //c.assign(beg,end)c.assign(n,elem) 将[beg; end)区间中的数据赋值给c。将n个elem的拷贝赋值给c。 //c.at(idx) 传回索引idx所指的数据,如果idx越界,抛出out_of_range。 //c.back() // 传回最后一个数据,不检查这个数据是否存在。 //c.begin() // 传回迭代器中的第一个数据地址。 //c.capacity() // 返回容器中数据个数。 //c.clear() // 移除容器中所有数据。 //c.empty() // 判断容器是否为空。 //c.end() // 指向迭代器中末端元素的下一个,指向一个不存在元素。 //c.erase(pos) // 删除pos位置的数据,传回下一个数据的位置。 //c.erase(beg,end) //删除[beg,end)区间的数据,传回下一个数据的位置。 //c.front() // 传回第一个数据。 //get_allocator // 使用构造函数返回一个拷贝。 //c.insert(pos,elem) // 在pos位置插入一个elem拷贝,传回新数据位置。 //c.insert(pos,n,elem) // 在pos位置插入n个elem数据。无返回值。 //c.insert(pos,beg,end) // 在pos位置插入在[beg,end)区间的数据。无返回值。 //c.max_size() // 返回容器中最大数据的数量。 //c.pop_back() // 删除最后一个数据。 //c.push_back(elem) // 在尾部加入一个数据。 //c.rbegin() // 传回一个逆向队列的第一个数据。 //c.rend() // 传回一个逆向队列的最后一个数据的下一个位置。 //c.resize(num) // 重新指定队列的长度。 //c.reserve() // 保留适当的容量。 //c.size() // 返回容器中实际数据的个数。 //c1.swap(c2) //swap(c1,c2) // 将c1和c2元素互换。同上操作。 //operator[] // 返回容器中指定位置的一个引用。 //set //set的各成员函数列表如下: //:begin()--返回指向第一个元素的迭代器 //:clear()--清除所有元素 //:count()--返回某个值元素的个数 //:empty()--如果集合为空,返回true //:end()--返回指向最后一个元素的迭代器 //:equal_range()--返回集合中与给定值相等的上下限的两个迭代器 //:erase()--删除集合中的元素 //:find()--返回一个指向被查找到元素的迭代器 //:get_allocator()--返回集合的分配器 //:insert()--在集合中插入元素 //:lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器 //:key_comp()--返回一个用于元素间值比较的函数 //:max_size()--返回集合能容纳的元素的最大限值 //:rbegin()--返回指向集合中最后一个元素的反向迭代器 //:rend()--返回指向集合中第一个元素的反向迭代器 //:size()--集合中元素的数目 //:swap()--交换两个集合变量 //:upper_bound()--返回大于某个值元素的迭代器 //:value_comp()--返回一个用于比较元素间的值的函数 //map //C++ Maps是一种关联式容器,包含“关键字/值”对 //insert() 插入元素 //erase() 删除一个元素 //clear() 删除所有元素 //find() 查找一个元素 //swap() 交换两个map //begin() 返回指向map头部的迭代器 //end() 返回指向map末尾的迭代器 //lower_bound() 返回键值>=给定元素的第一个位置 //upper_bound() 返回键值>给定元素的第一个位置 //rbegin() 返回一个指向map尾部的逆向迭代器 //rend() 返回一个指向map头部的逆向迭代器 //empty() 如果map为空则返回true //max_size() 返回可以容纳的最大元素个数 //size() 返回map中元素的个数 //count() 返回指定元素出现的次数 //value_comp() 返回比较元素value的函数 //key_comp() 返回比较元素key的函数 //get_allocator() 返回map的配置器 //equal_range() 返回特殊条目的迭代器对 int main() { list<int> li; li.push_back(3); li.push_back(4); li.push_back(5); li.push_back(6); list<int>::iterator itl=li.begin(); for(itl; itl!=li.end(); ++itl) { cout<<*itl<<endl; } map<char,vector<string> > express; vector<string> astr; astr.push_back("hi"); astr.push_back("whats your name?"); vector<string> qstr; qstr.push_back("hi"); qstr.push_back("my name is lucy!"); express['Q']=qstr;//map insert. express['A']=astr; map<char,vector<string> >::iterator it=express.find('Q');//map find; map<char,vector<string> >::iterator it2=express.find('A');//map find; vector<string> fstr=it->second; for(int i=0; i!=fstr.size(); ++i) { cout<<fstr[i]<<endl; } cout<< express.value_comp()(*it,*it2)<<endl;//容器的算法,比较value,对于map来说还是比较key. it.key < it2.key 返回true. allocator<map<char,vector<string> > > alloc= express.get_allocator(); alloc.destroy(); cout<<express.size()<<endl; express.erase(it); cout<<express.size()<<endl; return 0; }
map 的一个坑:
千万不要写成 abc[i] 来 查找一个元素。
abc[i]是表示map 的value.直接写。就等于给abc[i],用了默认的value 了。
map<int,string> abc; abc.insert(map<int,string>::value_type(2,"hi")); abc.insert(map<int,string>::value_type(6,"ok")); cout<<abc.size()<<endl; // abc[2]="hi"; // abc[6]="ok"; // abc[2]="test"; for(auto &a : abc) { cout<<a.first<<":"<<a.second<<endl; } for(int i=0;i<abc.size();++i) { cout<<i<<":"<<abc[i]<<endl; }
使用下面的进行便利。但要注意
for(auto &a ,是否需要修改元素,需要修改才用引用。否则用变量名,会调用赋值。一个临时变量而已。。
map<int,int> abc; abc.insert(map<int,int>::value_type(2,22)); abc.insert(map<int,int>::value_type(6,66)); cout<<abc.size()<<endl; // abc[2]="hi"; // abc[6]="ok"; // abc[2]="test"; for(auto &a : abc) { a.second=77; cout<<a.first<<":"<<a.second<<endl; } for(auto a : abc) { cout<<a.first<<":"<<a.second<<endl; }
关于 swap 效率分析。
void swapabc(vector<string>& a,vector<string>& b) { b=a; a.clear(); } int main() { vector<string> v1; for(int i=0;i<1;++i) { v1.push_back("abc"); } vector<string> v2; LSU_TIME::Timer a(3); for(int i=0;i<1000;++i) { v1.swap(v2); v2.swap(v1); } cout<<a.SpanTime()<<endl; LSU_TIME::Timer b(3); for(int i=0;i<1000;++i) { swapabc(v1,v2); swapabc(v2,v1); } cout<<b.SpanTime()<<endl;
只有一条数据swap 还是比一般的赋值,清空快1倍。基本说明只是交换指针。
而有1000条数据。swap 的效率是一般赋值,清空的600倍。
所以多线程下。数据的锁定,可以及时的用swap .之后放锁。
交换指针 1000次,是0.1毫秒。那么一般的内置类型赋值就是0.00005毫秒。
也就是1秒内可以1亿次赋值运算。还是虚拟机内。所以1秒的话可以最少3亿次赋值。
也就是说1万个并发。除去0.5秒的网络来回。如果要1秒内回应。
一个完整的处理最多1万次等同赋值的操作。
所以在快速反映的程序中。基本不能有千次级别的查询。不然几个查询下来,就就支持不了万并发了。