下面这段代码创建了一个简单的示例,演示了如何使用 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 对象的名称;否则输出未找到的消息。