C++ 矩阵到动态二维数组(带字符串)

C++ Matrix to dynamic 2D arrray (with strings)

假设我们有一个包含如下数据的 .txt 文件:

6
Paris New_York 1
London Berlin 1
Moskow Kiev 1
Paris London 1
New_York Moscow 1

其中 6 是城市数,表示巴黎,New_York 与值 1 相关联,它将始终为 1。

现在我想把它变成二维动态数组。我用这样的数字做的,但我不知道我应该如何用字符串做这个。 对于数字:

ifstream myfile("info.txt");
if (myfile.is_open()) {
    getline(myfile, line);
    istringstream(line) >> Number; 
}

int **matrix= new int*[Number];
for (int i = 0; i < Number; i++) {
    matrix[i] = new int[Number];
}

while (getline(myfile, line)) {
    cout << line << '\n';
    std::stringstream linestream(line);
    int row;
    int column;
    int value;
    if (linestream >> row >> column >> value)
    {
        a[row-1][column-1] = value;
        a[column-1][row-1] = value;// mirror
    }

那么我该如何为字符串做这个呢? 感谢您提供有用的答案

除了矩阵之外,您还需要一个 unordered_map<string, int> 来将字符串映射到索引。这是我的解决方案:

#include <iostream>
#include <sstream>
#include <string>
#include <fstream>
#include <unordered_map>
using namespace std;

int main() {
  string line;
  int Number;

  ifstream myfile("info.txt");
  if (myfile.is_open()) {
    getline(myfile, line);
    istringstream(line) >> Number;
  }

  int **matrix= new int*[Number];
  for (int i = 0; i < Number; i++) {
    matrix[i] = new int[Number](); // note () at the end for initialization to 0
  }

  unordered_map<string, int> citiesMap; // to map cities (string) to indexes (int)
  int cityIndex = 0;

  while (getline(myfile, line)){
    std::stringstream linestream(line);
    string row;
    string column;
    int value;

    if (linestream >> row >> column >> value) {
      if(citiesMap.find(row) == citiesMap.cend())
        citiesMap[row] = cityIndex++; // add city to the map if it doesn't exist

      if(citiesMap.find(column) == citiesMap.cend())
        citiesMap[column] = cityIndex++; // add city to the map if it doesn't exist

      matrix[citiesMap[row]][citiesMap[column]] = value;
      matrix[citiesMap[column]][citiesMap[row]] = value;// mirror
    }
  }

  for(auto x: citiesMap) {
    cout << x.first << ": " << x.second << endl;
  }
  cout << endl;

  for(int i = 0; i < Number; i++) {
    for(int j = 0; j < Number; j++) {
      cout << matrix[i][j] << " ";
    }
    cout << endl;
  }
  // matrix should be freed here
}

您可以选择将唯一的城市保存在向量(或数组)中,以便从其索引访问城市。不要忘记释放内存。此外,您可以使用 std::array 作为矩阵,而不必担心内存问题。