【发布时间】:2021-06-02 02:38:48
【问题描述】:
我对排序字符串 Table[X][Y] 有点卡住。正如标记的那样,我使用 C++ 并且必须使用标准库并使其适用于所有 C++(不仅仅是 C++ 11)。
Table 的大小是固定的(我让 X 读取文件有多少行,而 Y 是固定的,因为每一行都有不同的“属性”)。
当我创建表时,它的每个部分都以Table[X][Y] = stringX.data(); 的形式从先前从文件中读取并存储在字符串中的内容中获取。我在第一列中有数字(我将用作排序标准的那个),在其他列中有姓名、地址等。
创建Table的部分是:
Table[i][0] = string1.data();
Table[i][1] = string2.data();
Table[i][2] = string3.data();
Table[i][3] = string4.data();
Table[i][4] = string5.data();
其中“i”是while(fgets) 的当前“迭代”,它一次从文件中读取一行,执行一些操作并将读取的行的每个部分的“最终值”存储在这些字符串中。
我必须使用第一列作为标准以降序对该表进行排序。
让我们想象一下表格是这样的:Table[4][3]
20 | Jhon | 14th July
2 | Mary | 9th June
44 | Mark | 10th December
1 | Chris | 4th Feb
我需要这样的输出:
44 | Mark | 10th December
20 | Jhon | 14th July
2 | Mary | 9th June
1 | Chris | 4th Feb
我一直在阅读几个问题和页面,他们对 int/chars 数组进行排序或将数组转换为向量,然后使用它们。我试图在不转换任何内容的情况下对我拥有的字符串表进行排序(如果可能的话不知道)。
我不知道我是否设法解释了我已经足够清楚的问题和情况。我没有把我拥有的所有代码都放好,因为除了字符串表的声明和随后作为 string.data 放置在表中的字符串之外,其余代码与表和排序过程无关。代码打开文件,逐行读取,从一些分隔符和特殊字符中过滤我需要的信息,并将每个“排名标准”放到一个字符串中,然后在评估每个标准后分配一个“排名”并给出一个总分(然后存储在“string1”中)。
完成所有这些后,我创建字符串Table[x][y],并将过滤和处理的信息一次放置在该表中的一行中(因为我在从文件中读取每一行时都设置了这个)。
唯一剩下的就是将表格从得分最高的到最后的排序,然后创建一个包含前 10 名的文件。
我提前感谢并感谢您花时间阅读本文以及您可以提供的任何提示、信息、代码或来源。
【问题讨论】:
-
表格的大小是固定的(我让 X 读取文件有多少行,而 Y 是固定的,因为每一行都有不同的“属性”)。——对我来说,这听起来不像是“固定”大小。大小取决于行数。如果是这种情况,并且
X和Y实际上是运行时变量,那么std::string Table[X][Y];不是有效的C++。不要描述,而是发布minimal reproducible example。如果目标是对第一列进行排序,那么数据的来源并不重要。 -
为了清楚起见,您遗漏了与您的代码有关的最重要的信息——
Table实际上是如何声明的?同样,如果它是int X; int Y; X = somevalue; Y = somevalue;...std::string Table[X][Y];之类的东西,那么这不是标准 C++,因此你制作这个 C++ 的目标不会实现。 -
我从这段代码中得到 X:while(fgets(inputArray, sizeof(inputArray), fp) != NULL) { lineCount++;有了这个,我读取了所有文件并获取了文件的所有行,然后我使用变量“lineCount”作为表中的 X。 Y 是每个人拥有的“属性”的数量。在我的情况下是 6(姓名,姓氏,出生,性别,地址),最后一个是我给他们每个人的值,并且表的声明就像我所说的 => string Table[lineCount][6]跨度>
-
如前所述,这不是有效的 C++。可变长度数组从未成为标准 C++ 的一部分。 C++ 中的数组的大小必须由编译时常量而不是运行时变量来表示。如果列数是固定的,那么
std::vector<std::array<std::string, 6>> Table(lineCount);将是有效的 C++。 C++ 中的可变长度数组是std::vector。您现在使用的是某些编译器提供的编译器扩展,但如果您好奇,您的代码将无法使用 Visual Studio 或其他不接受非标准语法的编译器进行编译。 -
不要调用 data() 来存储字符串 char 数据。只存储字符串本身。