尝试在排序后保持年龄/名称对匹配

时间:2009-07-10 16:44:48

标签: c++

我正在编写一个用户输入名称然后输入年龄的程序。然后程序按字母顺序对列表进行排序并输出对。但是,我不确定在按字母顺序排序之后如何保持年龄与名称相匹配。我到目前为止所有的一切都是......

编辑:将代码更改为此 -

#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运算符的编译器错误。不知道该怎么办。

7 个答案:

答案 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方式),或者存储vectorstructpair个。对于类似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

欢呼声,