函数reserve
// vector::reserve
#include <iostream>
#include <vector>
int main ()
{
std::vector<int>::size_type sz;
std::vector<int> foo;
sz = foo.capacity();
std::cout << "making foo grow:\n";
for (int i=0; i<100; ++i) {
foo.push_back(i);
if (sz!=foo.capacity()) {
sz = foo.capacity();
std::cout << "capacity changed: " << sz << '\n';
}
}
std::vector<int> bar;
sz = bar.capacity();
bar.reserve(100); // this is the only difference with foo above
std::cout << "making bar grow:\n";
for (int i=0; i<100; ++i) {
bar.push_back(i);
if (sz!=bar.capacity()) {
sz = bar.capacity();
std::cout << "capacity changed: " << sz << '\n';
}
}
return 0;
}
结果:
making foo grow:
capacity changed: 1
capacity changed: 2
capacity changed: 4
capacity changed: 8
capacity changed: 16
capacity changed: 32
capacity changed: 64
capacity changed: 128
making bar grow:
capacity changed: 100
这个和vector a(100)的区别在于用了reserve之后只有这个容器满了才会二倍扩容,而后者在容器达到一定大小时,才会自动二倍扩容,这样容器一定是比内容大不少
std::unique()
该函数的作用是“去除”容器或者数组中相邻元素的重复出现的元素,注意
- 这里的去除并非真正意义的erase,而是将重复的元素放到容器的末尾,返回值是去重之后的尾地址。
- unique针对的是相邻元素,所以对于顺序顺序错乱的数组成员,或者容器成员,需要先进行排序,可以调用std::sort()函数
#include <iostream>
#include <algorithm>
int main(void)
{
int a[8] = {2, 2, 2, 4, 4, 6, 7, 8};
int c;
//std::sort(a, a + 8);
//对于无序的数组需要先排序
//但是无序数组也是可以用的,一般使用场景是有序数组
//同时容器内也可以使用
c = (std::unique(a, a + 8) - a );
//返回值是最后一个元素的地址,重复的放在后面
//所以使用完之后内存的大小是不变的
std::cout<< "c = " << c << std::endl;
//打印去重后的数组成员
for (int i = 0; i < c; i++)
std::cout<< "a = [" << i << "] = " << a[i] << std::endl;
return 0;
}
sort()和unique()的参数都是第一个元素地址,最后一个元素地址,然后都是包头不包尾,即最后一个元素不参与去重和排序
然后vector的end()函数输出的是元素最后一个元素的下一个元素地址,正好可以放在这个里面用