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

C++ C++;复制向量结构,但使用不同的对象,c++,vector,C++,Vector,我得到了一个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_ba

我得到了一个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"));
现在,我想生成一个向量,该向量包含指向
对象的指针,其顺序与向量
名称中的顺序相同:

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);
std::向量对象;
对象。推回(ptr_A);
对象。推回(ptr_A);
对象。推回(ptr_B);
对象。推回(ptr_C);
对象。推回(ptr_A);
因此,当两个名称相同时,指针也相同

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

我将使用它从基于名称的文件中读取对象,但我希望防止生成基本相同的多个对象


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

这将生成一个
查找
对象,该对象将名称映射到分配的对象,然后使用基于
名称
中的值填充向量
对象

typedef std::map::iterator迭代器;
typedef std::pair value_type;
地图查找//或者是无序的地图
查找.插入(值类型(“A”,ptr_A));
查找.插入(值类型(“B”,ptr_B));
查找.插入(值类型(“C”,ptr_C));
对于(int i=0;等秒);
}
如果要从文件生成名称和对象,可以执行类似操作,一次创建名称、对象以及它们之间的映射。我想你还得做其他事情,我不知道你的文件格式

std::string newname;
std::map<std::string, Object*> lookup;  //or maybe unordered_map
while(myfile >> newname)
    lookup[newname] = new Object(newname);
std::string newname;
地图查找//或者是无序的地图
while(myfile>>newname)
查找[newname]=新对象(newname);

这将生成一个
查找
对象,该对象将名称映射到分配的对象,然后使用基于
名称
中的值填充向量
对象

typedef std::map::iterator迭代器;
typedef std::pair value_type;
地图查找//或者是无序的地图
查找.插入(值类型(“A”,ptr_A));
查找.插入(值类型(“B”,ptr_B));
查找.插入(值类型(“C”,ptr_C));
对于(int i=0;等秒);
}
如果要从文件生成名称和对象,可以执行类似操作,一次创建名称、对象以及它们之间的映射。我想你还得做其他事情,我不知道你的文件格式

std::string newname;
std::map<std::string, Object*> lookup;  //or maybe unordered_map
while(myfile >> newname)
    lookup[newname] = new Object(newname);
std::string newname;
地图查找//或者是无序的地图
while(myfile>>newname)
查找[newname]=新对象(newname);

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

std::map


不能在地图中插入两个相同的关键点。如果尝试的插入与上一个键匹配,则返回原始键值。当请求一个键时,返回相同的指针。

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

std::map



不能在地图中插入两个相同的关键点。如果尝试的插入与上一个键匹配,则返回原始键值。当请求一个键时,会返回相同的指针。

听起来像是您想要一个
std::map
?至于如何回答您实际提出的问题,程序如何知道
ptr\u a
由“a”表示?运行时不知道相关性。它必须由您硬编码。根据您的编辑判断:根本不使用向量,只需从一开始就使用
map
。WAY更简单、更快。对象的构造将基于字符串向量中的名称(从文件中读取具有确切名称的对象)。你是说多重映射对吗?听起来你想要一个
std::map
?至于如何回答你实际提出的问题,程序如何知道
ptr\u a
由“a”表示?运行时不知道相关性。它必须由您硬编码。根据您的编辑判断:根本不使用向量,只需从一开始就使用
map
。WAY更简单、更快。对象的构造将基于字符串向量中的名称(从文件中读取具有确切名称的对象)。你是说多重映射对吗?如何使用构造函数中使用
名称的动态分配对象?e、 g
newobject(“A”)
@romeovs:What,比如
lookup.push_-back(值类型(“A”),newobject(“A”)?最好是
查找。向后推(值类型(“A”)、唯一类型(“A”))
@Prætorian:他已经说过他没有C++0x,我也不认为有什么改进,因为他们总是有。@romeovs:
unique\u ptr
可以防止各种错误,比如双重删除、忘记删除、意外复制等等。另外,我在答案中添加了加载代码。对于使用构造函数中的
名称
的动态分配对象,您会怎么做?e、 g
newobject(“A”)
@romeovs:What,比如
lookup.push_-back(值类型(“A”),newobject(“A”)?最好是
查找。向后推(值类型(“A”)、唯一类型(“A”))
@Prætorian:他已经说过他没有C++0x,我也不认为有什么改进,因为他们总是有。@romeovs:
unique\u ptr
可以防止各种错误,比如双重删除、忘记删除、意外复制等等。还有,我加了l
std::string newname;
std::map<std::string, Object*> lookup;  //or maybe unordered_map
while(myfile >> newname)
    lookup[newname] = new Object(newname);