C std :: vector>无法插入元素
int main() { using kv = std::pair<const int,int>; std::vector<kv> vec; kv a{1,1}; vec.insert(vec.begin(),a); } 我试图将元素插入到该向量中,但编译器给出了这个错误: cannot assign to non-static data member 'first' with const-qualified type 'const int' 而push_back()将正确编译.为什么?将元素插入到这样的向量中的正确方法是什么? 加: 解决方法
让我们从观察以下内容开始:
std::pair<const int,int> a,b; a=b; 这也不会编译.为什么?因为您实际声明了以下类: class my_pair { public: // ... Bunch of irrelevant stuff const int first; int second; }; 此类删除了其默认赋值运算符.默认赋值运算符等效于单独分配类成员: pair<first,second> &operator=(const pair<first,second> &other) { first=other.first; second=other.second; return *this; } 这是默认赋值运算符的粗略示例. 但是你不能在这里修改第一个类成员,因为它是一个const类成员.因此,删除默认赋值运算符.最终结果:不能将具有const值的std :: pair分配给另一个这样的对. 您现在应该能够自己弄清楚为什么对矢量上的insert()不起作用. insert()大致相当于在插入点之后的向量中将所有现有值移位1,以便为新值腾出空间.换一种说法: value[n+1]=values[n]; 对于超过插入点的所有值(我暂时忽略了将向量增加一个值所做的工作,这与此讨论无关). 但正如我所解释的那样,默认赋值运算符将被删除,因为该值具有const类成员. push_back有效,因为不需要插入任何东西,只需要在向量的末尾添加一个新值.如果需要重新分配向量,以适应??其增长,那么使用复制或移动构造函数,这对于具有const值的std ::对仍然有效. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |