我正在编写一个用户输入名称然后输入年龄的程序。然后程序按字母顺序对列表进行排序并输出对。但是,我不确定在按字母顺序排序之后如何保持年龄与名称相匹配。我到目前为止所有的一切都是......
编辑:将代码更改为此 -
#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);
}
我得到了!=运算符和cin运算符的编译器错误。不知道该怎么办。
答案 0 :(得分:11)
不是两个向量(一个用于名称,一个用于年龄),而是具有包含两者的新类型的向量:
struct Person
{
string name;
double age;
};
vector<Person> people;
修改评论
请记住您现在正在推动向量。你必须推送Person类型的东西。您可以通过以下几种方式完成此操作:
推回默认构造人员,然后设置名称和年龄字段:
people.push_back(Person());
people.back().name = name;
people.back().age = age;
为Person赋予一个带有名称和年龄的构造函数,并向Person推送一些值:
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;
person.name = name;
person.age = age;
people.push_back(person);
或更简单:
Person person = { name, age };
people.push_back(person);
(感谢avakar)
答案 1 :(得分:5)
除了jeje和luke发布的解决方案之外,您还可以将对插入map
(或multimap
,以防重复名称。)
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
请注意,如果您只提前填写一次,使用vector<person>
会更快。如果您决定动态添加/删除人员,map
会更快。
答案 2 :(得分:3)
您应该考虑将姓名和年龄放在结构化记录中。
然后对记录进行排序。
学家
答案 3 :(得分:2)
你可以有一个结构/类的向量,其中每个都有一个名字和一个年龄。排序时,使用仅查看名称字段的自定义比较器。
或者,构建另一个整数向量[0,names.size() - 1]。使用自定义比较器对其进行排序,而不是比较&lt; b比较名称[a]&lt;名称并[b]。排序后,整数向量将为您提供可应用于名称和年龄向量的排列。
答案 4 :(得分:1)
您需要同时交换两个向量中的元素(FORTRAN方式),或者存储vector
个struct
或pair
个。对于类似c的语言,后一种方法更为惯用。
答案 5 :(得分:1)
您应该使用pair<>
实用程序模板。参考here。
答案 6 :(得分:0)
天儿真好,
鉴于你是如何尝试对此进行建模的,我的直觉是你没有从面向对象的角度来解决这个问题。尝试使用类而不是结构。
struct是soooo K&amp; R! ( - :
将Person视为一个对象,并且它们具有紧密耦合的属性,例如姓名和年龄。甚至可能是地址,电子邮件,推特,体重,身高等等。
然后向您的对象添加有意义的函数,例如比较年龄,体重等。写一个&lt;电子邮件地址或Twitter id的运营商虽然有点奇怪。
OOA只是看看你的“物品”在现实生活中有什么属性,这为你设计物体提供了一个很好的起点。
为了更好地了解OOA,请查看Sally Shlaer和Stephen Mellor(sanitised Amazon link)出色的书“面向对象的系统分析:数据世界建模”。不要在亚马逊的价格上晕倒,虽然确实是83.33美元!至少它只有0.01美元的秒针......( - :
HTH
欢呼声,