gpt4 book ai didi

c++ - std::remove_if 中的 const 参数

转载 作者:可可西里 更新时间:2023-11-01 18:27:56 25 4
gpt4 key购买 nike

我要从对列表中删除元素。当我使用一对像

std::pair<const int, bool>

我得到以下编译错误:

In file included from /usr/local/include/c++/6.1.0/utility:70:0,

from /usr/local/include/c++/6.1.0/algorithm:60,

from main.cpp:1:

/usr/local/include/c++/6.1.0/bits/stl_pair.h: In instantiation of 'std::pair<_T1, _T2>& std::pair<_T1, _T2>::operator=(std::pair<_T1, _T2>&&) [with _T1 = const int; _T2 = bool]':

/usr/local/include/c++/6.1.0/bits/stl_algo.h:868:16: required from '_ForwardIterator std::__remove_if(_ForwardIterator, _ForwardIterator, _Predicate) [with _ForwardIterator = std::_List_iterator > _Predicate = __gnu_cxx::__ops::_Iter_pred&)> >]'

/usr/local/include/c++/6.1.0/bits/stl_algo.h:936:30: required from '_FIter std::remove_if(_FIter, _FIter, _Predicate) [with _FIter = std::_List_iterator > _Predicate = main()::&)>]'

main.cpp:17:32: required from here

/usr/local/include/c++/6.1.0/bits/stl_pair.h:319:8: error: assignment of read-only member 'std::pair::first'

first = std::forward(__p.first);

这是示例代码:

int main()
{
int id = 2;

std::list< std::pair <const int, bool> > l;
l.push_back(std::make_pair(3,true));
l.push_back(std::make_pair(2,false));
l.push_back(std::make_pair(1,true));

l.erase(std::remove_if(l.begin(), l.end(),
[id](std::pair<const int, bool>& e) -> bool {
return e.first == id; }));

for (auto i: l) {
std::cout << i.first << " " << i.second << std::endl;
}
}

我知道(如果我错了请纠正我):

  1. 只要列表的任何元素存在常量,我就会遇到完全相同的问题,例如 list <const int>也会返回一个编译错误。

  2. 如果我删除该对的第一个元素中的常量,代码将正常工作。

  3. 更优雅和高效的方法是使用 remove_if 列表方法,如下所示:

    l.remove_if([id](std::pair<const int, bool>& e) -> bool {
    return e.first == id; });

但我的问题是,std::remove_if 的内部工作原理到底是什么,它强制容器的元素不是const

最佳答案

将军std::remove_if随机排列项目值以将逻辑删除的值放在序列的末尾(它通常与成员函数 erase 结合使用以实际删除逻辑删除的值)。当项目不可复制或移动时,它无法进行这种洗牌。而是使用 std::list::remove_if .

关于c++ - std::remove_if 中的 const 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38918557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com