2009-07-10 60 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

歡呼聲,

相關問題