一 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指定大小分配空间

京公网安备 11010502036488号