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 作为矩阵,而不必担心内存问题。
假设我们有一个包含如下数据的 .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 作为矩阵,而不必担心内存问题。