1

可能重复:
remove_if 等效于 std::map

昨天我写了一个程序,它使用 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;

我感到震惊。我用谷歌搜索了这一刻,发现这与标准并不矛盾。套装也是一样。

如果标准算法不起作用,这怎么能矛盾?我怎样才能更好地更换容器?

4

3 回答 3

5

您不能std::remove_if在关联容器上使用算法。您需要编写一个for循环并使用该erase方法删除元素。有关更多详细信息,请参阅这个与 std::map 等效的类似问题remove_if

于 2010-09-23T06:01:42.417 回答
1

所有标准的有序/关联容器(map、set、multimap、multiset)都有不可变的键(只是键而不是整个容器)。

至于为什么只看每次更改键的值时会发生什么:键类型需要以某种方式通知它的容器它已更改(这会在容器和它是关键类型 - 更不用说对于基本类型不可能做到)因为需要使用容器以保持它的排序属性(这是一个相当大的开销)。

于 2010-09-23T06:27:47.817 回答
-3

因为multiset(和set)是不可变的容器,即容器中的元素不能就地修改修改,它们可以被删除、修改和(重新)插入。

参见,例如:

在简单的关联容器中,元素是键,元素是完全不可变的;因此嵌套类型 iterator 和 const_iterator 是相同的。

于 2010-09-23T05:59:59.710 回答