一 vector
1.插入、删除
#include <vector> #include <algorithm> // std::remove vector<int> vin; vector<int>::iterator itr = vin.begin(); for(int i=0;i<10;++i)vin.push_back(i); vin.pop_back();//删除最后一个元素 itr = vin.erase(vin.begin()+5);//删除第6个元素 vin.erase(vin.begin(),vin.begin()+3);//删除前3个 vin.push_back(10); vin.push_back(11); vin.push_back(10); vector<int>::iterator ret = remove(Numbers.begin(), Numbers.end(), 10);//删除vector中的10,注意,该函数只是将等于10的元素删除,然后将后面元素前移,但vector中的size并没有变,返回的迭代器指向第一个无效元素。ret->end都是无效的,一般等于原来的值 vin.clear();//删除所有元素,size变为0,但是容器体积不一定变化
二 map
1.构造、插入、访问与删除
#include <map> map<string, int> score;//如果是自定义的类型做key需要自定义比较函数传进去,如下 struct classcomp { bool operator() (const char& lhs, const char& rhs) const {return lhs<rhs;} }; std::map<char,int,classcomp> fourth; //插入方式 score.insert(pair<string,int>("stu1", 100)); score.insert(map<string, int>::value_type("stu2", 100)); pair<map<string, int>::iterator, bool> insert_r; insert_r = score.insert(map<string, int>::value_type("stu1", 100)); if(insert_r.second == true)//如果插入成功是真,如果已经存在对应关键值则插入失败,键值维持不变 score["stu2"] = 99;//这样的插入方式,如果键值已存在则可以直接覆盖。 //访问 //1、应用前向迭代器 map<string, int>::iterator i_map; for(i_map = score.begin(); i_map != score.end(); i_map++) //2、应用反向迭代器 map<string, int>::reverse_iterator i_map; for(i_map = score.rbegin(); i_map != score.rend(); i_map++) //3、[]方式,上面已经演示,这里不再说 //查找 int count = score.count("stu2");//返回stu2出现的次数~~~因为是唯一的,so出现过就是1,没有就是0 i_map = score.find("stu2");//返回迭代器,如果不是.end()就是存在的 int a = i_map->second 也可以使用[]方式进行查找,但是如果不存在,会以默认构造函数插入一个新的。 //删除 score.clear();//清空 bool is_empty = score.empty(); score.erase(i_map);//删除迭代器所在位置 score.erase(i_map, i_map+5)
2.将map中元素按照second元素进行排序
map<char, int> m;
for(auto c : str) ++m[c]; vector<pair<char, int> > pvec(m.begin(), m.end()); stable_sort(pvec.begin(), pvec.end(), [](const pair<char, int> &lhs, const pair<char, int> &rhs) {return lhs.second > rhs.second;} ); // 使用稳定排序, 不能直接使用sort. 稳定排序调用归并排序,符合题目要求。
三 vector 扩容为什么要以1.5倍或者2倍扩容
四 vector一直push_back会有啥问题吗?
会导致频繁的内存拷贝和内存释放,影响效率
改用reserve指定大小分配空间