如何解决删除删除习惯用法如何与范围/约束算法一起使用?
我正在尝试将c ++ 20约束算法用于擦除删除习惯用法:
std::vector<int> v;
v.erase(std::unique(std::begin(v),std::end(v)),std::end(v));
但是当我做一个简单的转换时:
v.erase(std::ranges::unique(v),std::end(v));
我得到error的erase
参数不匹配:
error: no matching function for call to 'std::vector<int>::erase(std::ranges::borrowed_subrange_t<std::vector<int>&>,std::vector<int>::iterator)'
如果第二个参数为std::ranges::end(v)
,则会产生类似的错误。
如何使它正常工作?
该问题最初使用remove
而不是unique
,但是所有容器都有一个过载的std::erase
,这使得该特定用例的动机降低。
解决方法
ec22instance:
Type: 'AWS::EC2::Instance'
CreationPolicy:
ResourceSignal:
Timeout: PT20M
Count: 1
Properties:
DisableApiTermination: false
EbsOptimized: false
ImageId: ami-071a99b84dd2f2924
InstanceInitiatedShutdownBehavior: stop
InstanceType: m4.2xlarge
KeyName: !Ref PemKeyName
Monitoring: true
SubnetId: !Ref AppAz1SubnetId
IamInstanceProfile: !Ref InstanceProfile
(和std::ranges::unique
)返回从第一个删除的元素到容器末尾的子范围,因此在传递给std::ranges::remove
之前,您需要使用std::begin
:
std::vector::erase
,
由于std::ranges::remove()
返回的不是迭代器,而是范围,所以它不起作用。但是即使您尝试v.erase(std::ranges::remove(...))
也不会起作用,因为矢量没有erase()
重载,该重载将范围作为参数。
相反,请看std::erase()
(在<vector>
中定义)。您所需的可能只是std::erase(v,42)
。
另一个选择是分解std::ranges::remove
/ unique
返回的子范围,并使用这些迭代器:
auto [Beg,End] = std::ranges::remove(v,42);
v.erase(Beg,End);
,
在C ++ 20中,std::ranges::unique/remove
返回一个std::ranges::subrange
,其中包含我们通常要擦除的子范围(begin()
指向第一个删除的元素,而{{1 }}指向容器的end()
),所以我认为C ++ 20中正确的擦除删除习惯是:
end()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。