删除条目矢量指针c ++的静态映射

时间:2014-04-10 08:54:50

标签: c++ dictionary

我有一个矢量指针的静态映射:

static std::map<type, std::vector<object *> > m_objects;

在这种情况下我该如何删除条目?

3 个答案:

答案 0 :(得分:4)

如果m_objects拥有object指向的std::vector,那么必须在delete的{​​{1}} object调用std::vector,或者使用智能指针,该指针会在object被破坏时自动删除std::vector(在这种情况下从map中删除时):

static std::map<type, std::vector<std::unique_ptr<object>>> m_objects;

如果object不属于m_object s,则不得调用delete(因为它们在别处使用)。


请参阅What C++ Smart Pointer Implementations are available?

答案 1 :(得分:1)

迭代地图中的每个条目,对于每个条目,迭代向量中的每个条目并删除它们。

for (auto it : m_objects) {
    for (auto ptr : it.second) {
      delete ptr;
    }
}

更好的解决方案可能是使用std::unique_ptrstd::shared_ptr

答案 2 :(得分:1)

更好的解决方案是not to use a vector of raw pointers并利用C ++ 11完美转发

#include <iostream>
#include <map>
#include <memory>
#include <vector>
using namespace std;

struct object {
};

enum type {
    TYPE0,
    TYPE1
};

typedef std::map<type, std::vector<std::unique_ptr<object> > > long_type;
static long_type m_objects;

int main() {

    std::vector<std::unique_ptr<object>> vec;
    vec.push_back(std::move(std::unique_ptr<object>(new object))); // make_unique in C++14

    m_objects.insert(std::pair<type, std::vector<std::unique_ptr<object>>>(TYPE0, std::move(vec)));

    long_type::iterator it = m_objects.find(TYPE0);

    m_objects.erase(it);

    cout << m_objects.size(); // 0

    return 0;
}

http://ideone.com/5L4g1x

通过这种方式,您不必担心在每个已分配的对象上调用delete(地图不会单独执行此操作)。

在插入和删除元素时,同样代表inserterase的正常std::map