vector< typename> name ;
vector本质是顺序表,是可以更改大小的"变长数组"。
typename为任意类型,例如:int、char、double、string、vector。
Tips:vector是可变大小数组的序列容器。vector使用动态分配数组来存储它的元素,物理空间连续,可以采用下标+[ ]对vector中的元素进行访问。在末尾插入或者删除一个元素时间复杂度为O(1),效率高,而在其他位置处进行插入或者删除一个元素时间复杂度为O(n),效率低,而对于其他物理空间不连续的容器采用迭代器或者引用的方式来访问元素效率高。
1. vector a ;
2.vector d(const vector& c) ;
3.vector c(iterator first, iterator last ) ;
4.vector b(size_t n, const typename& val ) ;
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
using namespace std;
int main()
{
vector<int> a;
for (auto it : a)
{
cout << it << ' ';
}
vector<int> b(5, 1);
for (auto it : b)
{
cout << it << ' ';
}
cout << endl;
string s("abcd");
vector<int> c(s.begin(), s.end());
//编码表-字符与ASCII值对应的表,内存中实际存储的是字符所对应的ASCII值
for (auto it : c)
{
cout << it << ' ';
}
cout << endl;
vector<int> d(b);
for (auto it : d)
{
cout << it << ' ';
}
return 0;
}
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << ' ';
}
cout << endl;
vector<int>::iterator it = v.begin();
while (it != v.end())
{
cout << *it << ' ';
it++;
}
cout << endl;
for (auto it : v) //只要该容器支持迭代器,就支持范围for,原因:范围for的底层实现为迭代器
{
cout << it << ' ';
}
cout << endl;
Tips:只要某个容器支持迭代器,就支持范围for, 原因:范围for的底层实现为迭代器。
1.size_t size( )const ;
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
using namespace std;
int main()
{
vector<string> v1(5, "1111"); //
cout << v1.size() << endl;
vector<int> v2;
v2.push_back(1);
v2.push_back(2);
v2.push_back(3);
vector<int> v3(v2.begin() + 1, v2.end());
cout << v2.size() << endl << v3.size() << endl;
return 0;
}
2.void clear( ) ;
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
using namespace std;
int main()
{
vector<int> v(4, 2);
cout << v.size() << ' ' << v.capacity() << endl;
v.clear();
cout << v.size() << ' ' << v.capacity() << endl;
return 0;
}
3.size_t capacity( )const ;
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
using namespace std;
int main()
{
vector<int> v; //测试vs下vector默认的扩容机制 -》1.5倍
size_t sz = v.capacity();
cout << "start capacity:" << sz << endl;
for (size_t i = 0; i < 100; i++)
{
v.push_back(i);
if (sz != v.capacity())
{
sz = v.capacity();
cout << "changed capacity:" << sz << endl;
}
}
return 0;
}
Tips:在vs下capacity呈1.5倍增长的,vs是PJ版本的STL、在g++(linux)下capacity呈2倍增长的,g++是 SGI版本的STL。vector的增容,具体增多少,不能固化,在不同编译器下增容的定义是不同的。
4.void reserve(size_t n) ;
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
using namespace std;
int main()
{
vector<int> v;
for (size_t i = 1; i < 15; i++)
v.push_back(i);
cout << v.size() << ' ' << v.capacity() << endl;
v.reserve(16); //情况一: size < n < capacity ->size不变,capacity不变
cout << v.size() << ' ' << v.capacity() << endl;
v.reserve(22); //情况二: n > capacity ->size不变,capacity改变,扩容
cout << v.size() << ' ' << v.capacity() << endl;
for (auto it : v)
{
cout << it << ' ';
}
cout << endl;
v.reserve(5); //情况三: size > n ->size改变,size不变,capacity不变
cout << v.size() << ' ' << v.capacity() << endl;
return 0;
}
相当于扩容,不会初始化。
不会改变数据,只会改变容量。当n < size 或 size < n < capacity,在vs下不会缩容,在g++下会缩容。
reserve(n),是否会开辟n个空间,取决于编译器,仅仅是向编译器做了个请求工作。
已知需开辟空间的大小为n,可以使用reserve(n),从而减少扩容的次数,提高效率,因为扩容有损耗。
5.void resize(size_t n, const typename& val = typename( ) ) ;
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
using namespace std;
int main()
{
vector<int> v;
for (size_t i = 1; i < 15; i++)
v.push_back(i);
cout << v.size() << ' ' << v.capacity() << endl;
v.resize(16); //情况一: size < n < capacity ->size改变,capacity不变,插入数据
cout << v.size() << ' ' << v.capacity() << endl;
v.resize(22); //情况二: n > capacity ->size改变,capacity改变,扩容+插入数据
cout << v.size() << ' ' << v.capacity() << endl;
for (auto it : v)
{
cout << it << ' ';
}
cout << endl;
return 0;
}
v.resize(5); //情况三: size > n ->size改变,capacity不变,删除数据
cout << v.size() << ' ' << v.capacity() << endl;
return 0;
}
void shrink_to_fit( ) ;
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
using namespace std;
int main()
{
vector<int> v;
for (size_t i = 1; i < 15; i++)
v.push_back(i);
cout << v.size() << ' ' << v.capacity() << endl;
v.resize(5);
cout << v.size() << ' ' << v.capacity() << endl;
v.shrink_to_fit();
cout << v.size() << ' ' << v.capacity() << endl;
return 0;
}
void pop_back( ) ;
void push_back( ) ;
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
using namespace std;
int main()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
for (auto it : v)
{
cout << it << ' ';
}
cout << endl;
v.pop_back();
for (auto it : v)
{
cout << it << ' ';
}
cout << endl;
return 0;
}
void erase(iterator position) ;
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
using namespace std;
int main()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.erase(v.begin() + 1);
for (auto it : v)
{
cout << it << ' ';
}
cout << endl;
return 0;
}
void insert(iterator position , const typename& x) ;
void insert(iterator position , iterator first , iterator end) ;
iterator find(iterator first, iterator end, const typename& x) ;
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
using namespace std;
int main()
{
vector<int> v1(5, 2);
vector<int> v2(3, 6);
v1.insert(v1.begin() + 2, 3);
v1.insert(v1.begin(), v2.begin(), v2.end());
for (auto it : v1)
{
cout << it << ' ';
}
cout << endl;
vector<int>::iterator p = find(v1.begin() + 1, v1.end(), 3);
if (p != v1.end())
cout << "查找到了" << endl;
else
cout << "查找不到" << endl;
return 0;
}
iterator begin( )、const_iterator begin( )const ;
Tips:const_iterator 修饰的是迭代器所指向的元素不能被修改,而迭代器本身可以被修改。const修饰this指针,表示在该成员函数中成员变量不允许被修改,此处const的用法只能用于类中的成员函数。
iterator end( )、const_iterator end( )const ;
iterator rbegin( )、const_iterator rbegin( )const ;
iterator rend( )、const_iterator rend( )const ;
铁铁们,vector用法详解就到此结束啦,若博主有不好的地方,请指正,欢迎铁铁们留言,请动动你们的手给作者点个鼓励吧,你们的鼓励就是我的动力✨