我有一个包含以下内容的文本文件:Bill, 89 Alex, 64 Dan, 29
,代表一些学生的姓名及其注释。
我想按笔记对它们进行升序排序,我的想法是为每个名称创建一个整数,例如:int dan = 29;
所以我可以对它们进行排序,但我不知道如何为这些名称分配一个整数文本文件
希望你能帮忙,因为这是我第一次制作一个更复杂的程序。谢谢!
答案 0 :(得分:5)
这里的问题是在C ++中(如在C中)你必须在编译时中定义所有变量,即编写代码时。在您的示例中,您拥有包含任意行数的文本文件,因此在编写代码时您并不真正了解它的内容。这就是为什么你的文件的每一行都没有自己的变量的原因。
因此,如果您需要存储有关文件每一行的信息,则可以执行此操作。首先,定义将存储信息(即带有名称+整数的字符串)的格式。这是您最有可能需要struct
或类似的地方。 struct
和class
是在一个结构中聚合不同变量的方法(实际上,它们不仅仅是那个,但目前不是重点)。如果你写了像
struct Data {
std::string name;
int ratio;
};
这意味着您刚刚定义了名为Data的数据类型,其中包含字段" name"和"比率"。所以你可以像这样使用它:
Data d;
d.name = "Ben";
d.ratio = 42;
在此之后,您需要一些可以让您存储许多数据条目的实体。例如,您可以使用数组。想象一下,你将在这里使用静态数组:
const std::size_t lineCount = getLineCount();
Data data_array[lineCount]; //Will not compile, since you cannot use variables as static arrays's size
for( std::size_t i = 0; i < lineCount; ++i ) {
data_array[i].name = readName();
data_array[i].ratio = readRatio();
}
问题在于,您可以看到,在编写代码时,您无法知道文本文件的行数。所以你可以用这段代码动态数组:
const std::size_t lineCount = getLineCount();
Data* data_array = new Data[lineCount];
for( std::size_t i = 0; i < lineCount; ++i ) {
data_array[i].name = readName();
data_array[i].ratio = readRatio();
}
delete[] data_array;
如果你在实际工作之前完成了你的文件,那么你可以设法知道行的数量,这将是有效的。
原始动态数组也不是很好用,因为您必须担心新的/删除功能对。因此,这里有来自Standart Template Library的名为 containers 的类。这些类为您提供了在其中插入数据的方法,并以多种方式使用此数据。这是类&#34; map&#34;,&#34; unordered_map&#34;,&#34; multimap&#34;,&#34; vector&#34;和其他人从以前的答案。他们最容易理解的是矢量,你可以阅读它here。其他人(说&#39; d,map)应该更适合你的任务。
最后,要对此类数据的数组(或容器)进行排序,您可以使用Standart Template Library中名为算法的函数。它们提供了以您需要的方式操作数据的通用方法。 您可以阅读更多here。
不确定我需要在这里多说些,探索链接,继续学习,祝你好运!
答案 1 :(得分:2)
可能有一种更聪明的方法可以做到这一点,但既然你是初学者就是我的建议:
使用std::multimap<int, std::string>
作为std::string
注释的名称(存储为int
)的查找表。如果某些名称具有相同的std::multimap
值,则需要std::map
而不是int
。另外,将所有数字存储在std::vector<int>
中并致电std::sort()
以对std::vector<int>
进行排序。现在它们已经排序,您可以使用std::multimap::find()
查找与每个int
值相关联的名称。
答案 2 :(得分:0)
使用std::unordered_map<string, int>
。
//用法:
std::unordered_map<string, int> content;
//open file;
while(/*not end of file*/){
std::string name;
int mark;
file>>name>>mark;
name.erase(name.end()-1);
content[name]=mark;
}
//close file;
答案 3 :(得分:0)
struct name_and_mark{
std::string name;
int mark;
bool operator<(name_and_mark &second){
return mark<second.mark;
}
};
std::istream& operator>>(std::istream &stream, name_and_mark &data){
stream>>data.name>>data.mark;
data.name.erase(data.name.end()-1);
return stream;
}
std::forward_list<name_and_mark> content;
//open file;
while(/*not end of file*/){
name_and_mark temp;
file>>temp;
content.push_front(temp);
}
//close file;
content.sort();
//检查出来:
std::ostream& operator<<(std::ostream &stream, name_and_mark &data){
stream<<data.name<<", "<<data.mark<<'\n';
return stream;
}
for(auto &i:content)
std::cout<<i;