关于替换不可赋值的向量元素存在两个问题:
一个对象不可赋值的一个典型原因是它的类定义包括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;
}