将对象存储在向量中,该向量位于C++中的映射中

store objects in vector, which is inside a map in C++

本文关键字:向量 C++ 映射 对象 存储      更新时间:2023-10-16

我正在尝试创建一个包含字符串键和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对象吗??

感谢

通常,当映射的类型是容器时,只使用[]任何地方都运转良好;如果条目不存在,则为使用空容器创建,因此类似于:

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;
    //  ...
}

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

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
}

EDIT(感谢我们2012):事实上,您有一个小错误(pos->second)[0]MyClass的对象,所以您使用.而不是使用->访问其成员。