加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C std :: vector>无法插入元素

发布时间:2020-12-16 10:14:53 所属栏目:百科 来源:网络整理
导读:int main() { using kv = std::pairconst int,int; std::vectorkv vec; kv a{1,1}; vec.insert(vec.begin(),a);} 我试图将元素插入到该向量中,但编译器给出了这个错误: cannot assign to non-static data member 'first' with const-qualified type 'const
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 ::对仍然有效.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读