代入できないベクトル要素の置換について、2 つの既存の質問があります。
オブジェクトが代入不可になる一般的な理由は、そのクラス定義にconst
メンバーが含まれているためにoperator=
削除されていることです。
std::vector
その要素型が代入可能である必要があります。実際、少なくとも GCC を使用すると、オブジェクトが代入可能でない場合、直接代入 ( ) も、要素を置換するとvec[i] = x;
の組み合わせも機能しません。erase()
insert()
vector::data()
、要素の直接破壊、コピー コンストラクターでの配置 new を使用する次のような関数を使用して、未定義の動作を引き起こすことなく要素を置き換えることができますか?
template <typename T>
inline void replace(std::vector<T> &vec, const size_t pos, const T& src)
{
T *p = vec.data() + pos;
p->~T();
new (p) T(src);
}
使用中の関数の例を以下に示します。これは GCC 4.7 でコンパイルされ、動作するようです。
struct A
{
const int _i;
A(const int &i):_i(i) {}
};
int main() {
std::vector<A> vec;
A c1(1);
A c2(2);
vec.push_back(c1);
std::cout << vec[0]._i << std::endl;
/* To replace the element in the vector
we cannot use this: */
//vec[0] = c2;
/* Nor this: */
//vec.erase(begin(vec));
//vec.insert(begin(vec),c2);
/* But this we can: */
replace(vec,0,c2);
std::cout << vec[0]._i << std::endl;
return 0;
}