0%

vector的基本使用和模拟实现

vector的基本使用

1
2
3
4
5
6
7
8
9
10
vector<int> v;
vector<char> v2;
vector<string> v3;

vector<int> v4(10, 5);//10个5

string s2 = "0123456789";
vector<char> v5(s2.begin(), s2.end());

vector<char> v6(v5);

vector的遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
string s = "0123456789";
vector<char> v(s.begin(), s.end());
vector<char>::iterator it = v.begin();
while(it != v.end())
{
cout << *it << " ";
*it = 'a';
it++;
}
cout << endl;

for(char& ch : v)
{
cout << ch << " ";
ch = 'b';
}
cout << endl;

for(int i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
v[i] = 'c';
}
cout << endl;

for(auto& ch : v)
{
cout << ch << " ";
}
  • 反向迭代器
1
2
3
4
5
6
7
8
9
string s = "0123456789";
vector<char> v(s.begin(), s.end());

vector<char>::reverse_iterator rit = s.rbegin();
while(rit != s.rend())
{
cout << *rit << " ";
rit++;
}
  • 只读迭代器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template <class T>
void printVec(const vector<T>& v)
{
vector<T>::const_iterator cit = v.cbegin();
while(it != c.cend())
{
cout << *cit << " ";
cit++;
}
cout << endl;

vector<T>::const_reverse_iterator it = v.crbegin();
while(crit != c.crend())
{
cout << *icrt << " ";
crit++;
}
cout << endl;
}

operator[ ]遍历越界,调试版本产生断言错误

at( )遍历越界,抛异常

vector容量

  • 增容:如果为空,容量为0

    PJ版本中增容按照大于1.5倍进行,SGI一般是2倍

resize(n, val):如果不给val参数,则使用默认值:内置类型 —-> 0;自定义类型 —-> 调用无参构造

  • data() 返回首地址指针

vector修改操作

  • insert()插入,==参数需要迭代器==,在pos之前插入元素
  • erase()删除pos之前的数据
1
2
3
4
5
6
vectot<int> v;
v.insert(v.begin(), 1);//1
v.insert(v.begin(), 5, 0);//000001
int a[] = {1, 2, 3, 4, 5};
v.insert(v.begin(), a + 1, a + 3);//23000001 表示左闭右开的范围(a + 1 , a + 3]
v.erase(begin());
  • push_back()尾插;·pop_back()尾删
1
2
3
4
vector<int> v
v.push_back(1);
v.push_back(2);
v.pop_back();

==迭代器失效问题==:迭代器指向的位置,空间被释放或者变成一个不可访问的位置

  1. 空间发生了变化,就会导致原来的迭代器失效 —-> push_back, insert, reserve, resize, assign
  2. 位置错位 —-> erase

解决方案:

  1. 重新获取迭代器
  2. 非删除接口:begin,end
  3. erase:直接获取其返回值,其返回值指向被删除元素的下一个元素的迭代器。潜在的问题:如果传入的迭代器为最后一个元素的迭代器,获取的返回值为end迭代器,也是一个不能访问的位置
  • emplaceemplace_back插入(更高效)
1
2
3
4
5
6
7
8
9
10
vector<B> v;
B b(1, 2);
v.insert(v.begin(), b);//12 插入
v.emplace(v.begin(), 3, 4);//12 34 构造 + 插入
B b2(5, 6);
v.emplace(v.begin(), b2);

v.push_back(b2);
v.emplace_back(b);
v.emplace_back(7, 8);//构造 + 尾插

vector的实现

start finish end_of_storage T * 类型

  • start 空间的首地址,第一个元素的首地址
  • finish 最后一个元素的结束位置
  • end_of_storage 空间的结束位置

vector的模拟实现GitHub链接

-------------本文结束感谢您的阅读-------------