最新ドラフト通読してたら std::vector (っていうか Sequence) のインタフェースが地味に進化してることにいまさら気が付いて驚いてる人ここに見参.
move 対応とか data とか cbegin/cend らへんに気を取られてたーよ.
namespace std {
template <class T, class Allocator = allocator<T> >
class vector {
public:
...
template <class... Args> void push_back(Args&&... args); // (A)
...
template <class... Args> iterator emplace(const_iterator position, Args&&... args); // (B)
...
// (C)
iterator insert(const_iterator position, const T& x);
void insert(const_iterator position, T&& x); (*)
void insert(const_iterator position, size_type n, const T& x);
template <class InputIterator>
void insert(const_iterator position,
InputIterator first, InputIterator last);
iterator erase(const_iterator position);
iterator erase(const_iterator first, const_iterator last);
...
};
...
}(A) は言われてみれば「あー!」っていうか何でこれの可能性にさっさと気が付かなかったのかにぇ?>俺
(B) は,新しく sequence に導入される, in-place construction インタフェイスとでもいうべき代物で,要するに position の位置に T(args...) で要素を直接生成するもの.右辺値参照をとる insert (*) との差別化がいまいち分からないんですけれど…….
(C) 以下何が変わっているか分かりにくいけれど,位置の指定が const_iterator でできるようになっている. (これまでは iterator ででしかできなかった) まー,vector オブジェクト自身が mutable でありさえすれば,位置の指定が const な iterator でできても不整合はないわなー.