微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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>是我想实现类似std :: map的东西,并且不应修改键值对中的键.但我不确定std :: pair< const int,int>这是正确的做法.

解决方法

让我们从观察以下内容开始:

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 ::对仍然有效.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐