【问题标题】:C++: Creating a "cost"/"distance" matrix from a vector of stringsC ++:从字符串向量创建“成本”/“距离”矩阵
【发布时间】:2021-08-23 14:48:09
【问题描述】:

我已经解决这个问题几天了,希望得到一些指导。

假设我有一个字符串向量“myVec”,它的定义如下:

(请注意,这些只是向量“内部”的值,我使用 push_back 函数将 myVec 定义如下):

myVec[0] = X Y 2 //There is a distance of 2 units between 'X' and 'Y'
myVec[1] = X Zebra 9 //There is a distance of 9 units between 'X' and 'Zebra'
myVec[2] = Y Zebra 3 //There is a distance of 3 units between 'Y' and 'Zebra'

我还能够将这些“位置”(X、Y 和 Zebra)保存在一个称为“路由器”的字符串向量中,这样:

routers[0] = X
routers[1] = Y
routers[2] = Zebra

我想创建一个基于“myVec”的“成本”矩阵,格式为:

0 2 9
2 0 3
9 3 0

每一行和每一列都代表位置,“X”、“Y”和“斑马”。在第一行中,它说:“X”到“X”需要 0 个单位,“X”需要 2 个单位才能到达 Y',“X”需要 9 个单位才能到达“斑马'。以此类推。下一行与位置“Y”相同,最后一行与位置“Zebra”相同

我创建成本矩阵的第一步是检索距离值(在本例中:2、9 和 3)

我创建了一些代码,以便我可以看到来自“myVec”的距离值,如下所示:

for (int i = 0; i <myVec.size(); i++)
{
    
    string s = myVec.at(i); 


    for (int j = 0; j <s.length(); j++) //going through chars of string in 'myVec' vec
    {

        if (isdigit(s[j])) //Going through myVec vector, and checking the numerical distance value
        {
            int dist = s[j] - '0'; //Converting the char to int
            cout<<dist<<endl;
        }
    }
        



}

上面的代码打印了 myVec - 2 9 和 3 的数值。但是,这是我一直卡住的地方,因为我正在努力编写代码应该如何/在哪里保存这些距离值。距离“2”是位置“X”和“Y”之间的距离,因此在成本矩阵中它应该存储在位置 [0][1] 和 [1][0] 中。除了,我真的很难弄清楚如何在代码中实现这一点。我考虑过使用比较来使用 .at() 函数循环遍历 myVec,并将它们与保存在“路由器”向量中的位置进行比较,但是这种策略在考虑位置'Zebra'时就失败了,它不是一个字符,而是一个字符串......

我真的很感激一些想法! 谢谢。

【问题讨论】:

  • myVec[0] = X Y 2 不是 C++。请创建一个合适的minimal reproducible example
  • 您好!抱歉,我刚刚编辑了我的问题。我确实使用 push_back() 来定义我的向量,但我只是对向量进行了索引,以便能够传达在这些向量位置保存的值。
  • 索引不是问题。问题是我们不知道向量的类型,我们不知道X Zebra 9 是什么,因为它不是有效的C++ 代码。我们无法猜测,因为那会浪费我们俩的时间。请创建一个minimal reproducible example

标签: c++ string vector multidimensional-array


【解决方案1】:

首先将您的 myVec 转换为一些可用的结构,例如

struct edge
{
    std::string from;
    std::string to;
    int dist;
};

然后创建从字符串位置名称到索引的映射。例如,首先将所有可能的位置存储在 std::set 中,然后用它创建一个 std::map&lt;std::string, int&gt; l2i

创建一个二维数组并存储所有已知距离。 distances[i][i] = 0;, distances[l2i[from]][l2i[to]] = dist;.

最后使用https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm 计算 APSP 并生成您的矩阵。

还可以使用std::stoi 从字符串转换为整数。不是你的减法。因为这只适用于个位数的距离。

编辑: 从 X 到 Zebra 只需 5 个单位。 X -(2)> Y -(3)> 斑马纹。如果您只想要没有 APSP 的矩阵,您也可以这样做 distances[l2i[from]][l2i[to]] = dist;distances[l2i[to]][l2i[from]] = dist;

【讨论】: