容器定义的类型别名
1 size_type
2 iterator, const_iterator, reverse_iterator, const_reverse_iterator, difference_type, value_type
3 reference
4 const_reference
顺序容器的操作1—访问
c.begin() 返回类型 iterator
c.end() 返回类型 iterator
c.rbegin() 返回类型 iterator
c.rend() 返回类型 iterator
c.back() 返回类型 reference
c.front() 返回类型 reference
c[n] 返回类型 reference(仅仅适用于vector, dequeue)
c.at(n) 返回类型 reference(仅仅适用于vector, dequeue)
例程:区别c.begin()与c.front()的返回值差异
if (!ilist.empty())
{
// val and val2 refer to the same element
list<int>::reference val = *ilist.begin();
list<int>::reference val2 = ilist.front();
// last and last2 refer to the same element
list<int>::reference last = *--ilist.end();
list<int>::reference last2 = ilist.back();
}
顺序容器的操作2—增加元素
c.insert(p,t), c.insert(p,n,t), c.insert(p,b,e)
//注意其中的P代表迭代器,而迭代器可能指向超出容器末端的下一位置,所以insert()函数全是在其指向位置之前而非之后插入数据。
c.push_back(t),
c.push_front(t),
增加元素相关操作注意事项:
迭代器返回值可能是超出容器末端的下一位置,此时特别容易出现问题。
问题例程:
vector<int>::iterator first=v.begin(), last=v.end();
while(first!=last){
first=v.insert(first, 42);
++first;
}
修改思路:
做最坏的打算,假设每次对容器的增添操作都会使得迭代器失效。
修改例程:
while(first!=v.end()){
first=v.insert(first, 42);
++first;
}
顺序容器的操作3—删除元素
c.erase(p) 返回类型 iterator,指向删除元素后一位所指向的元素
c.erase(b,e) 返回类型 iterator,指向删除元素段后一位所指向的元素
c.clear() 返回类型 void
c.pop_back() 返回类型 void
c.pop_front() 返回类型 void
顺序容器的操作4—关于大小
c.size() 返回类型c::size_type
c.max_size() 返回类型c::size_type
c.empty() 返回类型 bool
c.resize(n) 返回类型 void
c.resize(n,t) 返回类型 void
顺序容器的操作5—赋值
c1 = c2
c1.swap(c2) 交换的速度大于赋值
c.assign(b,e)
c.assign(n,t)
vector容器的自增长
vector容器的元素以连续的方式存放,所以,访问效率非常高。
而每当vector容器需要分配新的存储空间时,都会加倍当前的容量来实现重现分配。
string相关
例程1
//找出”r2d2”这个字符串中出现的所有数字
string::size_type pos = 0;
while ((pos = name.find_first_of(numerics, pos))!= string::npos) {
cout << "found number at index: " << pos<< " element is " << name[pos] << endl;
++pos; }