昨天我写了一个程序,它使用multiset来存储这样的元素:
std::multiset < boost::shared_ptr < CEntity > > m_Entities;
然后我尝试使用标准算法remove_if
,如下所示:
std::remove_if(m_Entities.begin, m_Entities.end(), MarkedForDestroy);
但是编译失败了,因为如果我们在GCC 4.4中看到set和multiset的实现,我们就会看到:
typedef typename _Rep_type::const_iterator iterator;
typedef typename _Rep_type::const_iterator const_iterator;
我很震惊。我这一刻谷歌更好,我发现这与标准不矛盾。集合相同。
如果标准算法不起作用,这怎么会不相矛盾?我怎样才能更好地更换容器?
答案 0 :(得分:5)
您不能在关联容器上使用std::remove_if
算法。您需要编写for
循环并使用erase
方法删除元素。有关更多详细信息,请参阅此类似问题remove_if equivalent for std::map。
答案 1 :(得分:1)
所有标准的有序/关联容器(map,set,multimap,multiset)都有不可变的键(只是键而不是整个容器)。
至于为什么只看一下每次更改密钥值时需要发生的事情:密钥类型需要以某种方式通知它的容器它已被更改(这将引入一个非常紧密和不必要的耦合容器和它的关键类型 - 更不用说基本类型不可能了)因为容器需要使用以保持它的排序属性(这是一个非常大的开销)。
答案 2 :(得分:-3)