擦除函数C ++的替代方法可以更好地节省内存和时间

时间:2016-08-12 19:31:56

标签: c++

我有以下代码,我想让它更好地工作并且更快。我想我应该改变擦除方法。请问有什么想法吗?我想我有内存泄漏,但我不知道该改变什么。

 #include <iostream>
#include <unordered_map>
#include <string>

class DocumentStorage
{
    class Document
    {
    public:
        Document(std::string& title, std::string& content)
        {
            this->title = title;
            this->content = content;
        }

        std::string title;
        std::string content;
    };

public:
    void add(int id, std::string title, std::string content)
    {
        storage[id] = new Document(title, content);
    }

    void remove(int id, std::string& title, std::string& content)
    {
        std::unordered_map<int, Document*>::iterator it = storage.find(id);

        Document* doc = it->second;
        title = doc->title;
        content = doc->content;

        storage.erase(it);   

    }

    void clear()
    {
        storage.clear();
    }

private:
    std::unordered_map<int, Document*> storage;
};

#ifndef RunTests
int main()
{
    DocumentStorage storage;
    storage.add(123456, "Hamlet", "Hamlet, Prince of Denmark.");
    storage.add(123457, "Othello", "Othello, the Moore of Venice.");

    std::string title, content;
    storage.remove(123456, title, content);

    std::cout << title << '\n';
    std::cout << content;

    storage.clear();
}
#endif

2 个答案:

答案 0 :(得分:2)

保留您通过新分配的Document*集合,意味着您可以通过致电delete来承担删除它们的责任。

最简单的(C ++ 11)修复方法是将存储更改为:

std::unordered_map<int, std::unique_ptr<Document>>

答案 1 :(得分:0)

添加某种状态成员并在需要时启动它。类似的东西:

class Document
{
  bool _inactive; // it equals false by default
};

...

删除功能中的

void remove(...)
{
  ...
  doc->setInactive();
}

最后你应该声明你自己的find函数,它会传递那些标记为非活动的记录。

我知道这有点奇怪,但希望它能起作用:)。