簡體   English   中英

C ++復制一個矢量結構,但是對象不同

[英]C++ copy a vector structure, but with different objects

我有一個向量std::string ,它表示對象指針的另一個向量的結構。 我想生成此對象指針向量,如果有兩個相同的對象,則向量中的指針也相同。

不知道我在那里的意思嗎? 讓我給你舉個例子。 假設我有一個std::vectorstd::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 )表示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*>

不能在地圖中插入兩個相同的鍵。 如果嘗試與前一個鍵匹配的插入,則返回原始鍵值。 請求鍵時,將返回相同的指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM