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