对vector容器的个人理解,具体使用方式可查阅手册:cplusplus.com
vector
1.构造
构造一个元素类型为int,元素为空的vector容器
vector<int> v1;
构造一个元素类型为int,4个元素且都为100的vector容器
vector<int> v2(4, 100);
区间构造,从arr起始位置到4的位置,4不会被构造进去
int arr[] = { 1,2,3,4,5 };
vector<int> v3(arr, arr + 3);
拷贝构造,v4拷贝构造v3
int arr[] = { 1,2,3,4,5 };
vector<int> v3(arr, arr + 3);
vector<int> v4(v3);
2.迭代器操作
2.1begin
返回起始位置的指针。如:通过对该指针++,解引用就可以访问元素了
int arr[] = { 1,2,3,4,5 };
vector<int> v3(arr, arr + 3);
vector<int> v4(v3);
auto it = v4.begin();
2.2end
返回的是vector中最后一个节点末尾位置,一般用来做判断条件的
vector<int> v3(arr, arr + 3);
vector<int> v4(v3);
auto it = v4.begin();
while (it != v4.end())//判断条件
{
cout << *it << endl;
it++;//迭代器++
}
结果:
2.3rbegin
反向迭代器,指向最后一个元素的位置
int arr[] = { 1,2,3,4,5 };
vector<int> v3(arr, arr + 3);
vector<int> v4(v3);
auto it = v4.rbegin();
2.4rend
反向迭代器,指向起始位置。
int arr[] = { 1,2,3,4,5 };
vector<int> v3(arr, arr + 3);
vector<int> v4(v3);
auto it = v4.rbegin();
while (it != v4.rend())
{
cout << *it << endl;
it++;
}
结果::在这里仍然需要++,而不是--
3.容量操作
3.1size
返回有效元素的个数。
int arr[] = { 1,2,3,4,5 };
vector<int> v3(arr, arr + 3);
vector<int> v4(v3);
cout << v4.size() << endl;
结果:
3.2resize
更改有效元素个数。
int arr[] = { 1,2,3,4,5 };
vector<int> v3(arr, arr + 3);
vector<int> v4(v3);
v4.resize(1);
cout << v4.size() << endl;
结果:
3.3capacity
返回底层容量的大小。
int arr[] = { 1,2,3,4,5 };
vector<int> v3(arr, arr + 3);
vector<int> v4(v3);
cout << v3.capacity() << endl;
cout << v4.capacity() << endl;
结果:
3.4empty
判断vector容量是否为空,即size个数为0个
int arr[] = { 1,2,3,4,5 };
vector<int> v3(arr, arr + 3);
vector<int> v4(v3);
if (!v4.empty())
cout << "非空" << endl;
结果:
3.5reserve
改变底层容量大小,即更改capacity的大小。注意:比oldcapacity大,会扩容,比oldcapacity小,不会做变化。
int arr[] = { 1,2,3,4,5 };
vector<int> v3(arr, arr + 3);
vector<int> v4(v3);
v4.reserve(100);//更改为100
cout << v4.capacity() << endl;
v4.reserve(3);//更改为3
cout << v4.capacity() << endl;
结果:
3.6shrink_to_fit
让vector容器的capacity调整到合适的大小,即有效元素为多少个,就为多大。
int arr[] = { 1,2,3,4,5 };
vector<int> v3(arr, arr + 3);
vector<int> v4(v3);
v4.reserve(100);//更改为100
cout << v4.capacity() << endl;
v4.shrink_to_fit();//会自动改为3
cout << v4.capacity() << endl;
结果:
4.元素访问
4.1operator[]
运算符重载,使vector容器中的元素,可以像数组一样访问。
int arr[] = { 1,2,3,4,5 };
vector<int> v3(arr, arr + 3);
vector<int> v4(v3);
cout << v4[0] << endl;
cout << v4[1] << endl;
cout << v4[2] << endl;
结果:
4.2at
和[]同样,对元素进行访问。
int arr[] = { 1,2,3,4,5 };
vector<int> v3(arr, arr + 3);
vector<int> v4(v3);
cout << v4.at(0) << endl;
cout << v4.at(1) << endl;
cout << v4.at(2) << endl;
结果:
4.3front
返回第一个元素。
int arr[] = { 1,2,3,4,5 };
vector<int> v3(arr, arr + 3);
vector<int> v4(v3);
cout << v4.front() << endl;
结果:
4.4back
返回最后一个有效元素
int arr[] = { 1,2,3,4,5 };
vector<int> v3(arr, arr + 3);
vector<int> v4(v3);
cout << v4.back() << endl;
结果:
4.5data
返回起始位置的指针
int arr[] = { 1,2,3,4,5 };
vector<int> v3(arr, arr + 3);
vector<int> v4(v3);
int *p = v4.data();
结果:操作该指针就可获取,更改vector容器中的值。
5.修改操作
5.1assign
更改vector容器中有效元素个数,并且设置为同样的值。
vector<int> vv{1,2,3,4,5,6};
vv.assign(7, 100);//7个100
5.2push_back
尾部插入数据。
vector<int> vv{1,2,3,4,5,6};
vv.push_back(7);
结果:
5.3pop_back
尾部删除数据。
vector<int> vv{1,2,3,4,5,6};
vv.push_back(7);
vv.pop_back();//7没了
结果:
5.4insert
3种插入方式:
- 指定位置,插入指定的元素
vector<int> vv{1,2,3,4,5,6};
vv.insert(vv.begin(), 2);//指定的位置为迭代器类型
结果:
2. 指定位置,指定插入多少个元素,指定的元素
vector<int> vv{1,2,3,4,5,6};
vv.insert(vv.begin(),5, 2);//插入5个元素,都为2
结果:
3. 指定位置,区间插入
int arr[] = { 6,5,4,3,2,1 };
vector<int> vv{1,2,3,4,5,6};
vv.insert(vv.begin(), arr, arr + 6);
结果:
5.5erase
两种删除方式:
- 删除指定位置,传入的是迭代器
vector<int> vv{1,2,3,4,5,6};
auto it = vv.begin() + 1;//删除2这个节点
vv.erase(it);
结果:
2. 区间删除,都传入迭代器
vector<int> vv{1,2,3,4,5,6};
vv.erase(vv.begin(),vv.begin() + 3 );//删除1 ~ 3
结果:
5.6swap
用于交换两个迭代器。
vector<int> vv{1,2,3,4,5,6};
vector<int> sw{ 6,5,4,3,2,1 };
vv.swap(sw);
结果:
5.6clear
清空vector容器,此时有效元素为0,容量还在。
vector<int> vv{1,2,3,4,5,6};
vv.clear();
结果:
6.模拟实现vector
namespace MyVector
{
template<class T>
class vector
{
public:
typedef T* iterator;
vector()//空构造
:_start(nullptr)
,_finish(nullptr)
,_end_of_storage(nullptr)
{}
vector(int n,const T& data = T())//可构造多个同样数据
:_start(new T[n])
,_finish(_start + n)
,_end_of_storage(_finish)
{
for (int i = 0; i < n; i++)
_start[i] = data;
}
template<class Iterator>
vector(Iterator first, Iterator end)//区间构造
{
auto it = first;
int count = 0;
while (it != end)
{
++count, ++it;
}
_start = new T[count];
_finish = _start;
_end_of_storage = _finish;
it = first;
int i = 0;
while (it != end)
{
_start[i] = *it;
++it, ++i;
}
}
vector(vector<T>& vv)//拷贝构造
{
_start = new T[vv.capacity()];
_finish = _start + vv.size();
_end_of_storage = _start + vv.capacity();
for (size_t i = 0; i < vv.size(); ++i)
{
*(_start+i) = vv[i];
}
}
~vector()//析构
{
if (_start)
delete[] _start;
_start = _finish = _end_of_storage = NULL;
}
//iterator 操作
iterator begin(const vector<T>& vv)
{
return _start;
}
iterator end(const vector<T>& vv)
{
return _finish;
}
//capacity操作
size_t size()const
{
return _finish - _start;
}
size_t capacity()const
{
return _end_of_storage - _start;
}
void resize(size_t n, const T& data = T())
{
size_t oldsize = size();
if (n > oldsize)
{
if (n > capacity)
reserve(n);
for (size_t i = oldsize; i < n; ++i)
_start[i] = data;
}
_finish = _start + n;
}
void reserve(size_t n)
{
size_t oldcapacity = capacity();
if (n > oldcapacity)
{
T* tmp = new T[n];
size_t count = size();
if (_start)
{
memcpy(tmp, _start, sizeof(T) * oldcapacity);
delete[] _start;
}
_start = tmp;
_finish = _start + count;
_end_of_storage = _start + n;
}
}
bool empty()const
{
return _start == _finish;
}
//element access
T& operator[](size_t n)
{
return *(_start + n);
}
T at(size_t n)
{
assert(n < size());
return *(_start + n);
}
T front()
{
return *_start;
}
T back()
{
return *(_finish - 1);
}
//modifiy
void push_back(const T& data)
{
if (_finish == _end_of_storage)//
{
reserve(capacity() * 2 + 1);
}
*(_finish++) = data;
}
void pop_back()
{
if (_finish == nullptr)
{
return;
}
--_finish;
}
iterator insert(iterator pos, const T& data)
{
if (_finish == _end_of_storage)
reserve(capacity() * 2 + 1);
auto it = end();
while (it != pos)
{
*it = *(it - 1);
--it;
}
*pos = data;
++_finish;
return pos;
}
iterator erase(iterator pos)
{
auto it = pos;
while (it != _finish)
{
*it = *(it + 1);
it++;
}
--_finish;
return pos;
}
iterator erase(iterator first, iterator end)
{
_finish = _start;
}
void clear()
{
erase(begin(), end());
}
void swap(vector<T>& x)
{
std::swap(_start, x._start);
std::swap(_finish, x._finish);
std::swap(_end_of_storage, x._end_of_storage);
}
private:
T* _start;
T* _finish;
T* _end_of_storage;
};
}