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());