Я пишу программу, в которой пользователь вводит имена, а затем стареет. Затем программа сортирует список по алфавиту и выводит пары. Однако я не уверен, как сохранить соответствие возраста именам после их сортировки в алфавитном порядке. Все, что у меня есть, это ...

Изменить: изменил код на это -

#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. Не знаю, что делать.

c++
2
Alex 10 Июл 2009 в 20:44

7 ответов

Лучший ответ

Вместо двух векторов (один для имен и один для возрастов) имейте вектор нового типа, который содержит оба:

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.name = name;
person.age = age;

people.push_back(person);

Или проще:

Person person = { name, age };
people.push_back(person);

(спасибо avakar)

11
luke 10 Июл 2009 в 17:56

В дополнение к решению, опубликованному 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 будет быстрее, если вы решите добавлять / удалять людей динамически.

5
avakar 10 Июл 2009 в 17:00

Вам следует подумать о том, чтобы объединить имена и возраст в структурированной записи.

Затем отсортируйте записи.

J.

3
jeje 10 Июл 2009 в 16:50

У вас может быть вектор структур / классов, у каждого из которых есть имя и возраст. При сортировке используйте настраиваемый компаратор, который смотрит только на поле имени.

Как вариант, создайте дополнительный вектор целых чисел [0, names.size () - 1]. Отсортируйте это с помощью специального компаратора, который вместо сравнения a

2
Jesse Hall 10 Июл 2009 в 16:52

Вам нужно либо поменять местами элементы в обоих векторах одновременно (способ FORTRAN), либо сохранить vector из struct или pair. Более поздний подход более идиоматичен для c-подобных языков.

1
dmckee --- ex-moderator kitten 10 Июл 2009 в 16:51

Вам следует использовать служебный шаблон pair<>. См. здесь.

1
Paul Sonier 10 Июл 2009 в 16:52

G'day ,

Учитывая то, как вы пытаетесь это смоделировать, мне кажется, что вы не подошли к проблеме с точки зрения объектно-ориентированного подхода. Попробуйте использовать класс вместо структуры.

Struct soooo K&R! (-:

Думайте о человеке как об объекте, и у него есть тесно связанные атрибуты, например Имя и возраст. Может быть, даже адрес, электронная почта, Twitter, вес, рост и т. Д.

Затем добавьте к своим объектам значимые функции, например сравнение возраста, веса и т. д. Написание оператора <для адресов электронной почты или идентификаторов Twitter немного странно.

OOA просто смотрит на то, какие атрибуты имеют ваши «объекты» в реальной жизни, и это дает вам хорошую отправную точку для проектирования ваших объектов.

Чтобы лучше понять OOA, взгляните на отличную книгу Салли Шлаер и Стивена Меллора «Объектно-ориентированный системный анализ: моделирование мира в данных» (дезинфицированная ссылка Amazon). Не падайте в обморок при цене на Amazon, хотя на самом деле 83,33 доллара! По крайней мере, это секундная стрелка 0,01 доллара ... (-:

HTH

Веселит ,

0
Rob Wells 12 Июл 2009 в 19:23