从地图内的stl地图中删除...在方法内部

时间:2015-06-16 11:14:06

标签: c++ dictionary stl

所以我试图在c ++中实现文件系统。 我有一个包含地图的目录类。 每个目录都可以在其中保存另一个目录(所以我在地图中有一个地图)

我试图删除一个文件/目录,在它删除的方法中一切都很好,但方法已经完成,我的主地图没有更新......

这里有相关代码:

目录类(使用Composite实现):

class Directory : public FileComponent
{
private:
std::map<std::string,FileComponent*> directoryList;
public:
std::map<std::string, FileComponent*> &getMap() {
    return directoryList;
}

class fileSystem:

private:
FileComponent* find(Mode mode, const std::string& newDirectory, const std::string& directoryName, std::map<std::string, FileComponent*> check);
std::map<std::string,FileComponent*> fileSystem;

};

这是我尝试做的事情(查找文件并将其复制......)

void filesys::copy(const std::string& fileName, const std::string& directoryName){
//looking for file
mapitr itr = fileSystem.find(fileName);
if (itr != fileSystem.end()){
    fileSystem.erase(itr);
    //file found, looikng for directory
}
else{
    for (itr = fileSystem.begin(); itr != fileSystem.end(); itr++){
        FileComponent* toCopy = find(CopyFile, fileName, directoryName, itr->second->getMap());
        if (toCopy != nullptr)
            //found! need to copy
            break;
    }
}

}

和我的发现方法:

FileComponent* filesys::find(Mode mode,const std::string& newDirectory, const std::string& directoryName, std::map<std::string,FileComponent*> check){
else if (mode == CopyFile){
     mapitr itr = check.find(newDirectory);
     if (itr != check.end()){
         FileComponent* toCopy = itr->second;
         check.erase(itr);
         return toCopy;
     }
     else{
         for (itr = check.begin(); itr != check.end(); itr++){
             FileComponent* toCopy;
             try{
             toCopy = find(CopyFile, newDirectory, directoryName, itr->second->getMap());
             if (toCopy != nullptr){
                 return toCopy;
             }
             }
             catch (mExceptions& e){
                 e.what();
             }

         }
         return nullptr;
     }
 }

}

它找到并删除的函数内部,所有内容似乎都是有序的...但是一旦返回目录/文件仍然在我的文件系统中... 我通过引用返回我的内部地图......所以我真的没有想法为什么它不想工作...

提前感谢!

2 个答案:

答案 0 :(得分:0)

您将 value 的参数check(地图)传递给find函数。这意味着数据被复制,您只能处理副本而不是原始数据。您应该通过*引用传递它:

std::map<std::string,FileComponent*>& check

在一个不相关的注释中,函数名find不是一个好名字,它并没有真正描述真正所做的功能,即找到擦除。

答案 1 :(得分:0)

filesys::find(Mode mode,
              const std::string& newDirectory,
              const std::string& directoryName,
              std::map<std::string, FileComponent*> check)

您按值传递check,而不是按引用传递,因此您修改副本,而不是原始副本。