C++ C++;复制向量结构,但使用不同的对象
我得到了一个std::string的向量,它表示另一个对象指针向量的结构。我想生成这个对象指针向量,如果有两个相同的对象,那么向量中的指针也是相同的 不知道我刚才说的是什么意思?让我给你举个例子。假设我有一个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::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、 gnewobject(“A”)
@romeovs:What,比如lookup.push_-back(值类型(“A”),newobject(“A”)代码>?最好是查找。向后推(值类型(“A”)、唯一类型(“A”))
@Prætorian:他已经说过他没有C++0x,我也不认为有什么改进,因为他们总是有。@romeovs:unique\u ptr
可以防止各种错误,比如双重删除、忘记删除、意外复制等等。另外,我在答案中添加了加载代码。对于使用构造函数中的名称的动态分配对象,您会怎么做?e、 gnewobject(“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);