vector的基本使用和实现

vector的基本使用

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的遍历

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 << " ";
}
  • 反向迭代器
string s = "0123456789";
vector<char> v(s.begin(), s.end());

vector<char>::reverse_iterator rit = s.rbegin();
while(rit != s.rend())
{
  cout << *rit << " ";
  rit++;
}
  • 只读迭代器
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之前的数据
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()尾删
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迭代器,也是一个不能访问的位置。

  • emplace、emplace_back插入(更高效)
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 空间的结束位置
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值