std::remove_if中的const参数
const arguments in std::remove_if
我将从对列表中删除元素。当我使用像这样的配对时
std::pair<const int, bool>
我得到以下编译错误:
在/usr/local/include/c++/6.1.0/utility:7:0中包含的文件中,
来自/usr/local/include/c++/6.1.0/算法:60,
来自main.cpp:1:
/usr/local/include/c++/6.1.0/bits/sstl_pir.h:在'std::对<_T2>&std::对<_T2>::运算符=(std::对<_T1,_T2>&;([with_T1=const int;_T2=bool]':
/usr/local/include/c++/6.1.0/bits/sstl_alg.h:868:16:必需自'_ForwardIterator std::__remove_if(_Forward Iterator,_Forward迭代器,_谓词([带有_ForwardIterator=std::_List_iterator>_Pdicate=__gnu_cxx::__ops::_Iter_pred&(>>]'
/usr/local/include/c++/6.1.0/bits/sstl_alg.h:936:30:必需自'_FIter std::remove_if(_FIter、_FIter和_Pedicate([带_FIter=std::_List_iterator>_药物=main((::&(>]'
main.cpp:17:32:从这里开始需要
/usr/local/include/c++/6.1.0/bits/sstl_pair.h:319:8:错误:赋值的只读成员"std::pair::first">
first=std::向前(__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;
}
}
我知道(如果我错了,请纠正我(:
只要列表中的任何元素都存在常量,我就会遇到完全相同的问题,例如,
list <const int>
也会返回编译错误。如果我删除对的第一个元素中的常量,代码就会工作。
更优雅、更有效的方法是使用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
。
如果您查看std::remove_if
的类型和迭代器需求,您可以看到实现必须类似于以下内容(从上面的链接(:
template<class ForwardIt, class UnaryPredicate>
ForwardIt remove_if(ForwardIt first, ForwardIt last, UnaryPredicate p)
{
first = std::find_if(first, last, p);
if (first != last)
for(ForwardIt i = first; ++i != last; )
if (!p(*i))
*first++ = std::move(*i);
return first;
}
也就是说,该算法只假设迭代器具有前向功能,并且元素是可移动的,并且它move
的元素在周围。当然,move
s不能在const
对象上完成。
- 不允许运算符 const 参数调用 const 成员函数
- std::p ackaged_task 应该删除带有 const 参数的复制 c'tor
- 将非 const 对象用于 const 参数
- 对可变参数模板使用 const 参数
- 为什么 QObject::d isconnect(const QMetaObject::Connection &connection) 采用 const 参数并打算修改它?
- 为什么static_assert在带有 const 参数的成员函数中不起作用?
- 如何使用 QString::replace on const& 参数?
- 将const char * const参数成员分配给新值
- 默认移动构造函数采用 const 参数
- 模板参数包无法推断"const&"参数
- const参数与const引用参数
- 重载解析不正确,const 参数的值为 0
- 无法将带有 const 参数的函数转换为函数指针?
- const参数与C 模板中的非const参考结合
- 该函数更改成员函数的const参数
- 重载比较运算符 C++,如何与 const 参数进行比较
- 为什么 const 数组优先绑定到 const T& 参数而不是 T&& 参数?
- const参数的类的只读版本
- 为什么这个 const 参数不能与非类型模板参数匹配?
- 没有匹配函数调用具有 const 参数的模板化函数