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

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...