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