C++ 用c+打印多维地图+;

C++ 用c+打印多维地图+;,c++,vector,maps,C++,Vector,Maps,我打印多维地图时遇到问题。我通过初始化它 map<string, map<string, vector<double>>> mapData; void Graph::addToGraph(string start, string next, double cos, double mile) { //see if the map contains the starting city string, add if not found if (mapData.fin

我打印多维地图时遇到问题。我通过初始化它

map<string, map<string, vector<double>>> mapData;
void Graph::addToGraph(string start, string next, double cos, double mile)
{
//see if the map contains the starting city string, add if not found
if (mapData.find(start) == mapData.end())
{
    mapData[start][start].push_back(invalid);
    mapData[start][start].push_back(invalid);
}

//see if the map contains the next city string, add if not found
if (mapData.find(next) == mapData.end())
{
    mapData[next][next].push_back(invalid);
    mapData[next][next].push_back(invalid);
}

mapData[start][next].push_back(cos);
mapData[start][next].push_back(mile);
double check = mapData[start][next][0];//test case
}
地图数据;
空图::addToGraph(字符串开始、字符串下一个、双cos、双英里)
{
//查看地图是否包含起始城市字符串,如果未找到则添加
if(mapData.find(start)==mapData.end())
{
mapData[start][start]。推回(无效);
mapData[start][start]。推回(无效);
}
//查看地图是否包含下一个城市字符串,如果未找到则添加
if(mapData.find(next)=mapData.end())
{
mapData[next][next]。推回(无效);
mapData[next][next]。推回(无效);
}
mapData[开始][下一步]。推回(cos);
地图数据[开始][下一步].向后推(英里);
双重检查=mapData[start][next][0];//测试用例
}
据我所知,在我看来,这张地图是正确创建的。我使用了三维模型,这样我可以存储里程和价格。这将用于最短路径算法。我想打印每个城市,以及所有到该城市的转机航班的里程和价格示例,SFA SLC$59700英里。这可能吗?如果不可能,我将如何改变它


为了更好地理解我为什么使用地图,项目的要求是我从一个文件中读取所有信息,从该文件中创建一个图形,然后让用户输入他们想要开始的城市的缩写。Maps允许我使用字符串指定数组中的一个点,该字符串对此非常有用。但我不确定它是否适用于这个算法

最简单的方法之一:

for(auto& kv : map)
{
    std::cout << kv.first << std::endl;
    std::cout << kv.second.first << std::endl;

    for(double d : kv.second.second
    {
    //..
    }
//..
}
{
用于(自动千伏:地图数据)
{
用于(自动千伏:千伏秒)
{
如果(kvv.second!=无效)
{

你能很容易地访问航班来自哪个城市吗?所以你似乎在问如何迭代转换不规则数据。如果你创建一个单独的“到”城市列表,那么转换后的访问就很简单(如果效率有点低)。如果你想要更高的效率,你会有一个完全不同的数据结构。离题:如果你是为了速度而编程,那么做一些测试,以确保缺乏良好的局部性不会影响你的性能。
kv。第三个
没有任何意义。我已经到了能够将第二个元素复制到新的向量,但是我似乎无法访问地图第二维度中的任何内容。因此,对于用户访问双精度向量,他们需要两个字符串和一个索引:
my_map.at(string_1).at(string_2).at(index)
。您还可以有效地将其设置为自定义类型的映射:
std::map
其中
Data
是一个包含价格、距离或您需要的任何其他信息的结构,字符串是位置的缩写名。这样,您可以键入
my\u map[place].field
来访问数据。例如:
我的地图[place]。price
我的地图[place]。distance
这对解决我的问题最有帮助。
std::vector<std::string> keys;

for(auto& kv : map)
{
    keys.push_back(kv.first);
}

for(auto s : keys)
{
    for(double d : map[s])
    {
    //..
    }
}
{
for (auto kv : mapData)
{
    for (auto kvv : kv.second)
    {
        if (kvv.second != invalid)
        {
            cout << kv.first << "<-->" << kvv.first;
            cout << " costs $" << kvv.second << endl;
        }
    }
    cout << distance(mapData.begin(), mapData.find("SLC"));
}
}