- size_type
iterator const_iterator
reverse_iterator const_reverse_iterator
difference_type value_type
reference const_reference
reference是做值类型,是value_type&的同义词;
逆序迭代器,是前后颠倒的迭代器,第一个迭代器为最后一个位置,最后一个迭代器为第一个位置元素前的位置;++reverse_iterator为向前移动;
value_type是元素的类型,很方便; - begin() end()
rbegin() rend()
逆序操作;
每个操作都有一个const成员,还有一个非const成员,两个版本; - push_back() push_front()
注意:push_front只使用与list和deque,不能用于vector - insert(p,t)
insert(p,n,t)
insert(p,begin,end)
注意返回类型,第一个为新插入的迭代器,后两个返回void - 插入容器的元素是原始元素的副本,与原始元素互不影响
- insert、push等操作,会导致整个容器重新加载,原来的迭代器可能失效,需要更新所有之后要用到的迭代器。
安全起见,假设所有的迭代器都会失效。 - vector<int>::iterator first = ivec.begin(), last = ivec.end();
while(first != last)
{
first = ivec.insert(first,42);
++first; //这句导致first越过了刚刚添加的元素
}
上述代码行为未定义,通常会导致死循环。因为insert操作导致迭代器失效,之前的last迭代器一样失效了,既不指向ivec的素,也不指向最后一个元素后的位置,first的!=操作也就没有判断为假的理由了。
注意:避免存储end()返回的迭代器,添加或删除deque或vector容器内的元素都会导致存储的迭代器失效!
上述代码可改为:
while(first != ivec.end() )
{
first = ivec.insert(first,42);
++first;
} - 容器 可以使用关系运算符做比较运算,但是:
(1)容器类型必须一样
(2)容器内的元素必须支持关系运算符的比较操作,否则容器不能做比较。
容器的比较,是使用元素的比较操作实现的,元素若不支持比较操作,容器自然不能比较。
容器的比较类似于string的比较操作,长度不相等,看是否为子序列(子序列是小的),不为子序列,则比较第一个不同的元素大小。
元素类型为string等时,使用string的比较操作。 - resize()的参数如果短于容器长度,则会删除后面原有的那部分元素,使容器长度等于resize的参数。
resize也可能使迭代器,注意是怎样使之失效的。 - front、begin、下标引用、at操作,都要注意不要指向不存在的元素,如果容器为空,更不要使用此类操作,否则:front、begin、下标引用结果导致运行时错误(run_time_error),at操作引起(out_of_range)异常。
- 顺序容器的删除操作:
erase(b,e)会删除从b开始,到e之前的迭代器,和两个迭代器之间的元素,即左闭合区间。
pop_front()只适用于list和deque容器。 - erase的两个迭代器参数,如果指向同一个元素(比如end),则不会删除任何元素。
如果都指向end,答案书籍上写到会出现运行时错误,但我运行时没有出现错误,VC2010的原因? - find()会从第一个参数开始查找,知道遇到第二个参数为止,不会查找第二个参数所指向的元素。
- 注意:erase和pop_back、pop_front同样可能使指向被删除的元素的所有迭代器失效,对于vector,删除点后的所有元素的迭代器都会失效;对于deque容器,如果删除时不包含第一个元素或最后一个元素,则容器中相关的所有迭代器都会失效。
- elem1 = find(ivec.begin(),ivec.end(),val1);
elem2 = find(elem1,ivec.end(),val2);
ivec.erase(elem1,elem2);
注意:val1和val2是不同的值,如果两个值相同,则elem1和elem2指向相同的位置,erase不会删除任何元素。 - 顺序容器的赋值操作:
c1 = c2;
c1.swap(c2);
c.assign(b,e);
c.assign(n,t);
如果两个容器类型相同,元素类型也相同,则可以使用"="操作符;
如果两个容器类型不相同,元素类型兼容,可以使用assign操作。
assign操作,会先删除容器中原来存储的所有元素,然后将参数中的容器中的元素复制过去。
注意:因为会先删除原有元素,所以参数中的迭代器决不能是操作容器中的迭代器。 - c1.swap(c2)
会交换两个容器中的所有元素,比如c1有10个元素,c2有25个元素,交换后,c1有25个元素,c2有10个元素。
注意:swap操作不会删除、插入任何元素,保证在常量时间内实现交换,由于不移动任何元素,所以原有迭代器不会失效。即
来指向c1第一个元素的迭代器,交换后指向c2的第一个元素。同一个元素,存储在不同的容器中而已。