2009-07-10 21 views
2

我正在编写一个程序,用户输入名称然后老化。程序然后按字母顺序对列表进行排序并输出对。但是,我不确定如何在按照字母顺序排序后保持与名称匹配的年龄。我所有的钱至今...试图在排序后保持年龄/姓名对匹配

编辑:改变了代码本 -

#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经营编译器错误!不知道该怎么办。

回答

11

而不是两个矢量(一个用于名字,和一个用于年龄),有一个新的类型,包含两者的矢量:征求意见

struct Person 
{ 
    string name; 
    double age; 
}; 

vector<Person> people; 

编辑:

请记住你现在正在推向矢量。您必须推送某种类型的人。您可以在一对夫妇的方式做到这一点:

推背默认构造的人,然后将姓名和年龄字段:

people.push_back(Person()); 
people.back().name = name; 
people.back().age = age; 

给人一个构造函数的名称和年龄,并推一些值的人:

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)

+0

我想这一点,但由于某种原因,我不能对值使用的push_back – Alex 2009-07-10 17:24:36

+1

你可以做`人person = {name,age}; people.push_back(person);` – avakar 2009-07-10 17:50:51

3

您应该考虑将姓名和年龄放在一起记录在结构化记录中。

然后对记录进行排序。

J.

1

你要么需要在同一时间(FORTRAN方式)交换两个向量的元素,或储存的vectorstruct S或pair小号。后面的方法对于类C语言更加习惯。

+0

FORTRAN现在也有结构:http://en.wikipedia.org/wiki/Fortran_language_features#Derived_data_types – PTBNL 2009-07-10 17:24:12

1

您应该使用pair<>实用程序模板。参考文献here

2

你可以有一个结构/类的向量,其中每个结构都有名称和年龄。排序时,使用只查看名称字段的自定义比较器。

或者,建立一个额外的整数向量[0,names.size() - 1]。用自定义比较器对其进行排序,而不是比较名称[a] <名称[b],而不是比较<。排序后,整数向量将为您提供可应用于名称和年龄向量的排列。

5

除jeje和luke发布的解决方案外,您还可以将这些配对插入map(或multimap,以防万一重名)。

请注意,使用vector<person>时,如果您只提前填充一次,速度会更快。如果您决定动态添加/删除人物,则map会更快。

0

天儿真好,

鉴于你是如何想这个模型,我的直觉是,你还没有从面向对象的角度来处理这个问题。尝试使用类而不是结构。

struct's soooo K & R! ( - :

觉得一个人作为对象,他们有紧密耦合的属性,如姓名和年龄甚至地址,电子邮件,微博,体重,身高等

然后添加到您的。对象的功能是有意义的,例如比较年龄,权重等。编写一个<运营商的电子邮件地址或Twitter的ID有点奇怪,虽然

OOA只是看着你的“对象”在现实生活中有什么属性并为您设计物体提供了一个很好的起点。

要得到一个OOA的更好概念可以看看由Sally Shlaer和Stephen Mellor撰写的优秀着作“面向对象系统分析:数据世界建模”(sanitised Amazon link)。尽管83.33美元的价格不亚于亚马逊的价格!至少它是$0.01秒手...( - :

HTH

欢呼声,

相关问题