使用C++ 标准库map关联式容器根绝键值查找文件是否存在

发布时间:2023年12月23日

下面这段代码创建了一个简单的示例,演示了如何使用 std::map 存储和检索 std::shared_ptr 类型的对象。代码中的注释已经对每一步进行了说明

#include <iostream>
#include <map>
#include <string>
#include <memory>

class ObjFile{
public:
    void setName(const std::string&name){
        FileName_=name;
    }
    std::string getName() const { 
        return FileName_;
    }
private:
    std::string FileName_;
};

int main(){

    std::map<std::string, std::shared_ptr<ObjFile>> files_;         //定义了一个名为 files_ 的 std::map
                                                                    //其中键是 std::string 类型,值是 std::shared_ptr<ObjFile> 类型的对象

    std::shared_ptr<ObjFile> file1 = std::make_shared<ObjFile>();   // 创建一个指向 ObjFile 类型对象的 std::shared_ptr 智能指针file1
    file1->setName("File1"); // 设置文件名字
    files_["File1"] = file1; //代码将 file1指针以键值对的形式存储到 files_中
                                //将名为 "File1" 的字符串作为key,将file1这个指向ObjFile对象的智能指针作为value
                                //这样,在 files_ 这个 std::map 中,就建立了一个key为 "File1" 的条目,它对应着 file1 这个指针所指向的 ObjFile 对象。

    std::shared_ptr<ObjFile> file2 = std::make_shared<ObjFile>();
    file2->setName("File2");
    files_["File2"] = file2;

    std::cout<<"What files in files_ :"<<std::endl;
    for (const auto &file_it : files_){
        std::cout<<file_it.second->getName()<<std::endl;
    }

    std::string Input;
    std::cout<<"which file you want to find ?"<<std::endl;
    std::cin >> Input;
    // 在 files_ 中查找名为 "File2" 的 systemFile 对象
    std::string keyToFind = Input;
    auto it = files_.find(keyToFind);   //在 files_ 这个 std::map 中查找名为 keyToFind 的键
                                                    //如果找到了匹配的键,则it 将指向这个匹配的元素,是一个指向 std::map 中键值对的迭代器。
                                                    //如果没有找到匹配的键,it 将等于 files_.end(),表示没有找到匹配的元素

    // 检查是否找到了匹配的键
    if (it != files_.end()) {
        // 如果找到了,则输出相关联的 ObjFile 对象的信息
        std::shared_ptr<ObjFile> foundObjFile = it->second; //second成员表示与key对应的value部分,也就是一个 std::shared_ptr<ObjFile> 类型的对象
                                                            //将这个value部分(也就是一个 std::shared_ptr<ObjFile> 对象)赋值给 foundObjFile 变量
                                                            //这个变量 foundObjFile 现在持有了指向 std::map 中特定键所对应的 ObjFile 对象的智能指针
                                                            //以通过 foundObjFile 这个智能指针来访问或者操作对应的 ObjFile 对象
        std::cout << "Found target with name: " << foundObjFile->getName() << std::endl;
        // 这里可以输出其他属性或者进行其他操作
    } else {
        // 如果没有找到匹配的键,则输出未找到的消息
        std::cout << "Key "<< Input << " not found in files_" << std::endl;
    }

    return 0;
}



输出1:
What files in files_ :
File1
File2
which file you want to find ?
File1
Found target with name: File1
输出2:
What files in files_ :
File1
File2
which file you want to find ?
File2
Found target with name: File2
输出3:What files in files_ :
File1
File2
which file you want to find ?
abd
Key abd not found in files_

这个示例演示了如何使用 std::map 以及 std::shared_ptr 结合存储和检索对象,并根据键来访问特定的对象
定义类 ObjFile:

ObjFile 类有一个成员函数 setName() 来设置文件名和一个 getName() 函数来获取文件名。
在 main() 函数中:

创建了一个 std::map<std::string, std::shared_ptr> files_;,用于将字符串键与 std::shared_ptr 对象关联起来。
使用 std::make_shared() 创建了两个 ObjFile 类型的对象,并分别设置了它们的名称。
将这两个对象分别存储到 files_ 中,以字符串键 “ObjFile1” 和 “FileTarget” 作为键。
通过 files_.find(keyToFind) 在 files_ 中查找名为 “FileTarget” 的键,如果找到了匹配的键,则获取与其关联的 std::shared_ptr 对象。
如果找到了匹配的键,则输出相关联的 ObjFile 对象的名称;否则输出未找到的消息。

文章来源:https://blog.csdn.net/keke_Memory/article/details/135163192
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。