C++复制矢量结构,但使用不同的对象

C++ copy a vector structure, but with different objects

本文关键字:对象 复制 结构 C++      更新时间:2023-10-16

我有一个std::string向量,它表示另一个对象指针向量的结构。我想生成这个对象指针向量,如果有两个相同的对象,则向量中的指针也是相同的。

不知道我刚才是什么意思?我举个例子。假设我有std::string std::vector

std::vector<std::string> names;
names.push_back(std::string("A"));
names.push_back(std::string("A"));
names.push_back(std::string("B"));
names.push_back(std::string("C"));
names.push_back(std::string("A"));

现在假设这些名称(ABC(代表一个Object的三个不同实例:

Object* ptr_A = new Object(1); // A
Object* ptr_B = new Object(2); // B
Object* ptr_C = new Object(3); // C

我现在想生成包含指向Object的指针的向量,其顺序与向量names中的顺序相同:

std::vector<Object*> objects;
objects.push_back(ptr_A);
objects.push_back(ptr_A);
objects.push_back(ptr_B);
objects.push_back(ptr_C);
objects.push_back(ptr_A);

这样,当两个名称相同时,指针也相同。

我将如何有效地做到这一点?请注意,我希望在执行此操作的函数中动态分配对象,以便以后可以使用向量。

我将使用它来根据名称从文件中读取对象,但我想防止创建多个基本相同的对象。

由于这是家庭作业,我还不能使用 C++11。

这会生成一个lookup对象,该对象将名称映射到分配的对象,然后根据 names 中的值填充向量objects。 简单。

typedef std::map<std::string, Object*>::iterator iterator;
typedef std::pair<std::string, Object*> value_type;
std::map<std::string, Object*> lookup;  //or maybe unordered_map
lookup.insert(value_type("A", ptr_A));
lookup.insert(value_type("B", ptr_B));
lookup.insert(value_type("C", ptr_C));
for(int i=0; i<names.size(); ++i) {
    iterator iter = lookup.find(names[i]);
    if (iter == lookup.end())
         throw std::runtime_error("invalid name in file");
    objects.push_back(iter->second);
}

如果要从文件生成名称和对象,可以执行类似操作来同时创建名称、对象以及它们之间的映射。 我假设您还必须做其他事情,我不知道您的文件格式。

std::string newname;
std::map<std::string, Object*> lookup;  //or maybe unordered_map
while(myfile >> newname)
    lookup[newname] = new Object(newname);
不要使用

std::vector,而是使用包含 std::string 键和 Object* 值的std::map

std::map<std::string, Object*>

映射中不得插入两个相同的键。如果尝试插入与前一个键匹配,则返回原始键值。请求密钥时,将返回相同的指针。