记录一些punchline和tip
———————————————分割线———————————————————
SHOW:迭代器的随机访问:即跳跃式访问
判断某一容器的迭代器是否支持可随机访问:
以vector为例
//思路:先定义一个vector的迭代器,再让这个迭代器+一个非0数
vector<int>::iterator it = v.begin();
it+=3;
**如果编译器不报错,即表示支持随机访问
SHOW:用swap收缩空间(同时还要用resize重置容器大小)
void skill01()
{
vector<int> v01;
for (double i = 0; i < 1000000; i++)
{
v01.push_back(i); //**初始化v01**
}
cout << "容量" << v01.capacity() << endl;
cout << "实际元素个数" << v01.size() << endl;
v01.resize(3); //用resize充值v01的大小
vector<int>(v01).swap(v01); //初始化一个匿名对象,并用swap将匿名与v01交换
cout << "容量" << v01.capacity() << endl; //缩小容量目的达到
cout << "实际元素个数" << v01.size() << endl;
}
SHOW:用reserve预留足够大的空间以减小开辟空间的时间
vector的结构为连续线性空间,当上一次找到的一段连续空间满载后,需要重新寻找一段更大的连续空间,
并且之前的迭代器(指针)全部失效,需要重新对指针赋值,因此
p=&v02[0]; num++; 两行可以对迭代器进行重新赋值,并用num记录重新开辟空间的次数
void skill02()
{
vector<int> v02;
v02.reserve(10000);
int* p = NULL;
int num = 0;
for (int i = 0; i < 10000; i++)
{
v02.push_back(i);
if (p != &v02[0])
{
p = &v02[0];
num++;
}
}
}
**SHOW:循环终止条件必须要有 **!=****,否则会出现越界提示,程序崩溃
//正确形式
for (deque<int>::iterator it = Score.begin(); it != Score.end(); it++)
双向循环链表判定
NULL
list反转排序
1.区别于逆序遍历,逆序遍历不改变原先各位置上的值,反转排序则会改变值
2.如果直接用sort()
,系统会报错
原因: 所有不支持随机访问的容器都不能使用系统提供的算法
解决方法,调用容器自带的,比如:L.sort();
3.反转排序步骤`L.reverse();L.sort();
void myPrint(list<int>&L)
{
for (list<int>::iterator it = L.begin(); it != L.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
list<int> L;
L.push_back(10);
L.push_back(20);
L.push_back(40);
L.push_back(30);
L.reverse();
myPrint(L);
L.sort();
myPrint(L);
}
SHOW:map,multimap的value(也就是<>里的第二个)为自定义数据类型(类类型)时如何表示
//示例
multimap<int, Worker>::iterator it = m.begin();
cout << "姓名" << it->second.name << "工资" << it->second.pay << endl;
(*it).name; //非关联式容器
–分割线________________
相似单词区分专栏!!!!!!`
part1:reverse() & reserve()
巧记:瑞佛斯(reverse)//反转,1,3,5------>5 , 3, 1 verse跟serve对称,所以reverse是反转
瑞瑟夫(reserve) 预留足够大的空间:serve谐音save,留出,前缀re,重新留出==预留