GCC树STL数据容器

时间:2010-09-23 05:53:22

标签: c++ gcc stl set multiset

  

可能重复:
  remove_if equivalent for 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;

我很震惊。我这一刻谷歌更好,我发现这与标准不矛盾。集合相同。

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

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

至于为什么只看一下每次更改密钥值时需要发生的事情:密钥类型需要以某种方式通知它的容器它已被更改(这将引入一个非常紧密和不必要的耦合容器和它的关键类型 - 更不用说基本类型不可能了)因为容器需要使用以保持它的排序属性(这是一个非常大的开销)。

答案 2 :(得分:-3)

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

例如见:

  • 不同的set相关答案
  • tutorial
  • 中的第27.3.2.1节
  

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