1

我正在尝试创建一个包含字符串键和 myClass 向量的映射。

std::map<string,vector<myClass>> m;

我还需要动态填充矢量和地图(从文件中读取值)。

class myClass{
string dataMember1;
...
myClass()
     { ...  }
};

我应该如何进行?

我还希望能够根据字符串键访问向量中的对象。

例如:

std::map<string,vConnect>::iterator pos;
pos = mapGraph.find(string);
cout<<(pos->second)[0]->DataMemberofmyClass

(pos->second)[0] 会指示存储在向量中的第一个 myClass 对象吗?

谢谢

4

2 回答 2

5

一般来说,当映射类型是容器时,只使用[] wherein就可以了;如果该条目不存在,它将使用一个空容器创建,例如:

m[key].push_back( newElement );

或者

m[key].begin(), m[key].end()

甚至:

if ( !m[key].empty() )
    doSomethingWith( m[key].second[0] );

正常工作。如果您正在对同一元素执行多项操作(如前两种情况),您可能希望将其保存在引用中:

std::vector<MyClass>& elem = m[key];
//  ...

唯一的例外是如果您没有修改元素,并且如果它是空的,您不想创建条目。在这些情况下,您需要find, 和一个测试:

std::map<std::string, std::vector<MyClass>>::const_iterator
                entry = m.find( key );
if ( entry != m.end() ) {
    std::vector<MyClass>& elem = entry->second;
    //  ...
}
于 2013-02-08T14:38:10.597 回答
2

使用这种嵌套类型与使用简单的地图或矢量没有太大区别。所以地图的一个元素是一个向量。获取此元素并将其用作向量。

pos = mapGraph.find(string);

返回映射中的迭代器。

(pos->second)

是作为此迭代器的值的向量。因此,只需像使用vector. 除了您从不检查是否确实找到了元素这一事实之外,您的代码是正确的。

std::map<string,vConnect>::iterator pos;
pos = mapGraph.find(string);
if (pos != mapGraph.end()) {
 cout<<(pos->second)[0].DataMemberofmyClass
}

编辑(感谢 us2012):事实上你有一个小错误(pos->second)[0]是 Object ofMyClass所以你使用.不使用来访问它的成员->

于 2013-02-08T14:07:10.620 回答