9.3.2 访问元素

----------- 在顺序容器中访问元素的操作
c.back() 返回c中尾元素的引用。若c为空,函数行为未定义(不适用于forward_list)
c.front() 返回c中首元素的引用。若c为空,函数行为未定义
//以下只适用于string、vector、deque、array
c[n] 返回c中下标为n的元素的引用,n是一个unsigned型。若n>=c.size()。则函数行为未定义
c.at(n) 返回下标为n的元素的引用。如果下标越界,则抛出一out_of_range异常
if(!c.empty())
{
  auto val = *c.begin(), val2 = c.front();
  auto last = c.end();
  auto val3 = *(--last);
  auto val4 = c.back();
}
  • 访问成员函数返回的是引用
if(!c.empty())
{
  c.front() = 42;
  auto &v = c.back();
  v = 1024;
  auto v2 = c.back();
  v2 = 0;
}
  • 下标操作和安全的随机访问

使用越界的下标是一种严重的程序设计错误,而且编译器并不检查这种错误。 如果我们希望确保下标是合法的,可以使用at成员函数,如果下标越界,at会抛出异常

vector<string> svec;
cout<<svec[0]; //运行时出错
cout<<svec.at(0); //抛出异常

9.3.3 删除元素

-------------------- 顺序容器的删除操作(不适用于array)
c.pop_back() 删除c中尾元素。若c为空,则函数行为未定义。函数返回void(forward_list不支持)
c.pop_front() 删除c中首元素。若c为空,则函数行为未定义。函数返回void(vector、string不支持)
c.erase(p) 删除迭代器p所指的元素,返回一个指向被删除元素之后元素的迭代器,若p指向尾元素,则返回尾后迭代器。若p是尾后迭代器,则函数行为未定义
c.erase(b,e) 删除迭代器b和e所指定范围的元素。返回指向最后一个删除元素之后元素的迭代器,若e本身就是尾后迭代器,则函数也返回尾后迭代器
c.clear() 删除c中所有元素。返回void

删除元素的成员函数并不检查其参数,在删除之前,需要确保它们是存在的。

  • pop_back和pop_front成员函数
while(!ilist.empty())
{
  process(ilist.front());
  ilist.pop_front();
}
  • 从容器内部删除一个元素
list<int> lst = {0,1,2,3,4,5,6,7,8,9};
auto it = lst.begin();
while(it != lst.end())
{
  if(*it % 2)
  {
    it = lst.erase(it);
  }
  else
  {
    ++it;
    }
}
  • 删除多个元素
elem1 = slist.erase(elem1,elem2);
slist.clear();
slist.erase(slist.begin(), slist.end());