代码之家  ›  专栏  ›  技术社区  ›  kasandra

如何从集合中删除共享ptr元素?

  •  1
  • kasandra  · 技术社区  · 7 年前

    我有一个集合,其中集合中的每个元素都是 shared_ptr ,我想从集合中删除一个元素,在eclipse中,该元素实际上已被删除,但当我在bash中使用valgrind进行测试时,我得到了许多无效的大小错误。。。

    所以这让我想到,也许有一种不同的方法来删除类型为 共享\u ptr ?

    peoplePointer中的每个元素都是特定人员的一个类:

    typedef std::shared_ptr<person> peoplePointer;
    
    class AA {
        std::set<peoplePointer> setOfPeople;
    
    public:
        // function getName() return name of the person (person is another class) 
        void removeSomeonefromA(const std::string& name) {
            for (std::set<peoplePointer>::iterator it = setOfPeople.begin();it != setOfPeople.end(); it++) {
                if(name == (*it).get()->getName()) {
                    setOfPeople.erase((it));
                }
            }
        }
    };
    
    1 回复  |  直到 7 年前
        1
  •  4
  •   R Sahu    7 年前

    灵感来源于 remove_if equivalent for std::map .

    如果您能够使用C++11或更高版本的编译器,则可以使用:

    void removeSomeonefromA(const string& name)
    {
       for (set<peoplePointer>::iterator it = setOfPeople.begin(); it != setOfPeople.end();  /* Empty */ )
       {
          if(name == (*it).get()->getName())
          {
             it = setOfPeople.erase(it);
          }
          else
          {
             ++it;
          }
       }
    }
    

    如果需要使用以前的编译器版本,可以使用:

    void removeSomeonefromA(const string& name)
    {
       for (set<peoplePointer>::iterator it = setOfPeople.begin(); it != setOfPeople.end();  /* Empty */ )
       {
          if(name == (*it).get()->getName())
          {
             setOfPeople.erase(it++);
          }
          else
          {
             ++it;
          }
       }
    }