C++ 尝试在排序后保持年龄/姓名对匹配
我正在写一个程序,用户输入名字,然后老化。然后程序按字母顺序对列表进行排序并输出对。然而,我不知道如何在按字母顺序排序后保持年龄与姓名的匹配。到目前为止我所知道的只是 编辑:将代码更改为此-C++ 尝试在排序后保持年龄/姓名对匹配,c++,C++,我正在写一个程序,用户输入名字,然后老化。然后程序按字母顺序对列表进行排序并输出对。然而,我不知道如何在按字母顺序排序后保持年龄与姓名的匹配。到目前为止我所知道的只是 编辑:将代码更改为此- #include "std_lib_facilities.h" struct People{ string name; int age; }; int main() { vector<People>nameage; cout << "E
#include "std_lib_facilities.h"
struct People{
string name;
int age;
};
int main()
{
vector<People>nameage;
cout << "Enter name then age until done. Press enter, 0, enter to continue.:\n";
People name;
People age;
while(name != "0"){
cin >> name;
nameage.push_back(name);
cin >> age;
nameage.push_back(age);}
vector<People>::iterator i = (nameage.end()-1);
nameage.erase(i);
}
#包括“std_lib_facilities.h”
结构人{
字符串名;
智力年龄;
};
int main()
{
矢量化;
姓名;
名称。推回(名称);
cin>>年龄;
姓名。向后推(年龄);}
向量::迭代器i=(nameage.end()-1);
姓名。删除(i);
}
我得到的编译器错误为!=操作员和cin操作员。不知道该怎么办你应该考虑把名字和年龄放在结构化的记录中。 然后对记录进行排序 J.不是两个向量(一个代表姓名,一个代表年龄),而是一个新类型的向量,其中包含:
struct Person
{
string name;
double age;
};
vector<Person> people;
为人员提供一个具有姓名和年龄的构造函数,并向人员推送一些值:
struct Person
{
Person(const string& name_, double age_) : name(name_), age(age_) {}
string name;
double age;
};
people.push_back(Person(name, age));
创建一个人,给他一些值,然后将其推到向量中:
Person person;
person.name = name;
person.age = age;
people.push_back(person);
或者更简单地说:
Person person = { name, age };
people.push_back(person);
(感谢avakar)您或者需要同时交换两个向量中的元素(FORTRAN方式),或者存储
结构的向量或对。后一种方法对于类c语言更为惯用。您应该使用pair
实用程序模板。参考。您可以有一个结构/类的向量,其中每个结构/类都有名称和年龄。排序时,使用仅查看名称字段的自定义比较器
或者,构建一个额外的整数向量[0,names.size()-1]。使用自定义比较器对其排序,该比较器不是比较a除了jeje和luke发布的解决方案外,您还可以将对插入到映射中(或者多映射,如果允许重复名称)
assert(names.size()==ages.size());
地图人物;
对于(size_t i=0;i
请注意,如果您只提前填充一次,则使用vector
会更快。map
如果您决定动态添加/删除人员会更快。G'day
考虑到您试图对此建模的方式,我的直觉是您还没有从OO的角度来处理这个问题。尝试使用类而不是结构
结构是Sooo K&R!(-):
把一个人看作一个对象,他们的属性是紧密耦合的,例如姓名和年龄,甚至可能是地址、电子邮件、推特、体重、身高等等
然后将有意义的功能添加到对象中,例如比较年龄、权重等。不过,为电子邮件地址或Twitter id编写<运算符有点奇怪
OOA只是查看您的“对象”在现实生活中具有哪些属性,这为您设计对象提供了一个良好的起点
要更好地了解OOA,请看一看Sally Shlaer和Stephen Mellor()的优秀著作《面向对象的系统分析:在数据中建模世界》。不要对亚马逊的价格感到失望,尽管它确实是83.33美元!至少它是0.01美元的二手货…(-):
嗯
干杯,并失去所有意义?除非是为了一个非常临时的破解,是的。否则-谢谢,不。FORTRAN现在也有结构:@PTBNL:取决于FORTRAN的风格:在FORTRAN 90之前,标准中没有结构,只有少数编译器支持它们。我使用了旧的(全部大写)拼写作为提示。我尝试了这个方法,但由于某些原因,我无法对值使用push_back。您可以执行Person-Person={name,age};people.push_back(Person);
Person person = { name, age };
people.push_back(person);
assert(names.size() == ages.size());
map<string, double> people;
for (size_t i = 0; i < names.size(); ++i)
people[names[i]] = ages[i];
// The sequence [people.begin(), people.end()) is now sorted