0

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

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

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代表 an 的三个不同实例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。

4

2 回答 2

4

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

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);
于 2012-05-07T19:11:10.410 回答
1

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

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

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

于 2012-05-07T19:11:19.753 回答