0

std::stringオブジェクト ポインタの別のベクトルの構造を表す のベクトルがあります。このオブジェクト ポインターのベクトルを生成したいと思います。同じオブジェクトが 2 つある場合、ベクトル内のポインターも同じです。

私がそこに何を意味するのか分かりませんか?例を挙げましょう。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"));

ここで、これらの名前 ( ABおよびC) が の 3 つの異なるインスタンスを表しているとします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);

2 つの名前が同じ場合、ポインターも同じになるようにします。

これを効率的に行うにはどうすればよいですか?ベクトルを後で使用できるように、これを行う関数内でオブジェクトを動的に割り当てたいことに注意してください。

これを使用して、名前に基づいてファイルからオブジェクトを読み取りますが、基本的に同じオブジェクトを複数作成しないようにしたいと考えています。

これは宿題なので、まだ 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

を使用する代わりに、 のキーと値を含む をstd::vector使用します。std::mapstd::stringObject*

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

2 つの同一のキーをマップに挿入することはできません。前のキーと一致する挿入が試行されると、元のキー値が返されます。キーが要求されると、同じポインターが返されます。

于 2012-05-07T19:11:19.753 に答える