我认为:基本的数组、vector、deque,这3种数据结构在 noi 考试中有不可替代的作用,其他的结构大概都可以拿这3种基本结构模拟。个人认为,在算法竞赛中,出题人不会直接出个语法题让你直接做,总要绕点弯,才能显示出题人的水平嘛,这里面就是要给“拆”字:拆散、加料,组合的过程。而STL是不能拆的,我们只能拆自己模拟的数据结构。所以这3种可以模拟其他结构的结构就太重要了。deque加进来是因为它有一个O(1)的头插。
复习vector
复习是为了记住,而要记住当然字越少越好,只记必须记的,所以我就画了一张图,每次用到vector的时候,我就头脑中想象这种图,把它牢牢的记在心里。
]
重点说明
1、查找和替换函数在 algorithm 中。
2、clear函数不能把元素置0,只是把size置0,请自行保证访问的元素下标前用size去判断是否合法。
3、vector 置 0,用 assign 函数,v.assign(v.size(),0)
,还可以用 fill(v.begin(),v.end(),0)
,经过我的实测 assign 比 fill 快 30% 左右。
4、rbegin, rend 函数要使用逆迭代器:vector<int>::reverse_iterator rit
5、删除erase函数返回一个指向删除元素后的元素的迭代器,所以删除用for循环要小心多加一次导致跳过某个元素。最好用while循环,因为删除使迭代器已经自动跳到删除后的元素上。
6、有2种删除方式,删除一个,删除一片。v.erase(pos),v.erase(first,last)
7、插入insert函数返回指向插入的第一个元素的迭代器。插入有3种方式,插入1个,插入多个同样的值,插入一片值。
v.insert(pos,value),v.insert(pos,n,value),v.insert(pos,first,last)
,注意都是插到pos前面。
8、插入和删除都可能引发迭代器失效。因为插入会导致重新分配内存,以及插入位置后面的元素向后移动。删除中间元素同样会导致删除后面的元素向前移动,进而使迭代器失效。