vector
动态数组,可随机访问,尾插尾删复杂度为1,中间为n
可自动扩容(为安全起见,扩容后迭代器应重新复制,insert亦是如此)
创建
1.vector<int> primes {2, 3, 5, 7, 11, 13, 17, 19};
2.vector<double> values(20);20个元素且全部默认为0
3.std::vector<double> values(N,data);N个元素全部为data
4.可以使用拷贝构造,
std::vector<char>value1(5, 'c');
std::vector<char>value2(value1);
5.可以传用两个范围来构造(指针迭代器都可以)
int array[]={1,2,3};
std::vector<int>values(array, array+2);//values 将保存{1,2}
std::vector<int>value1{1,2,3,4,5};
std::vector<int>value2(std::begin(value1),std::begin(value1)+3);//value2保存{1,2,3}
reserve
预留容器的空间 reserve (size_type n);
注意:
1.如果已有空间大于n,则什么都不干
2.不会影响已存储元素
3.如果用来扩容,之前的迭代器可能失效(可能在其他地方开辟空间,拷贝过去)
迭代器
end指向的是最后一个元素的下一个位置
实际使用时,其返回值类型都可以使用 auto 关键字代替,编译器可以自行判断出该迭代器的类型。
由 cbegin() 和 cend() 只能访问,不能修改
vector中的迭代器,可以++,-- ,可以+n-n
访问
front和back,返回第一个和最后一个元素的引用
size和capacity
size表现有元素个数,capacity表最多可以容纳多少元素。
insert和emplace()
iterator insert (const_iterator position, const value_type& val);
iterator insert (const_iterator position, size_type n, const value_type& val);
iterator insert((const_iterator position,first,last)
返回的迭代器指向插入位置,但和原先的position不一定相同
iterator emplace (const_iterator pos, args...);
注意:一次只能插入一个元素,但是效率更高
push_back()和 emplace_back()
用法一样,只是底层实现机制不同,push_back()是先创建一个元素,然后拷贝过去,而emplace是直接找到要插入的内存直接写入。
pop_back()
void pop_back();
只能删除最后一元素,不改变容量,改变大小
erase
iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);
返回的迭代器指向被删元素的下一个
remove
定义在 头文件中,删除容器中中和指定元素相同的元素。注意:不会改变size和capacity大小
返回最后一个被删元素下一个,类似于end();
删除后虽然不会改变大小和容量,但是会10 30 30 10 10 ? ? ?
int main () {
int myints[] = {10,20,30,30,20,10,10,20}; // 10 20 30 30 20 10 10 20
// bounds of range:
int* pbegin = myints; // ^
int* pend = myints+sizeof(myints)/sizeof(int); // ^ ^
pend = std::remove (pbegin, pend, 20); // 10 30 30 10 10 ? ? ?
// ^ ^
std::cout << "range contains:";
for (int* p=pbegin; p!=pend; ++p)
std::cout << ' ' << *p;
std::cout << '\n';
return 0;
}
clear
删除所有元素,不会改变其容量
shrink_to_fit()
将当前 vector 容器的容量缩减至和实际存储元素的个数相等。