アプリ版:「スタンプのみでお礼する」機能のリリースについて

参考書の練習問題が解けません。教えてください。
以下問題文です。

5つの名前をvector<string> nameに読み込み、名前が指定された人の年齢をユーザに入力させ、年齢をvector<double> ageに格納せよ。次に、name[i]とage[i]のペアを5つ出力せよ。名前をソートし(sort(name.begin(), name.end()))、name[i]とage[i]のペアを出力せよ。ここで注意しなければならないのは、age vectorの順序をソートされたname vectorと正しく一致させることである。ヒント:ageをソートする前にコピーを作成し、それを使ってageをソートした後の正しい順序でageのコピーを作成する。つぎに同じことを繰り返すが、今後は任意の数の名前を使用できるようにする。


以上です。よろしくお願いいたします。

A 回答 (2件)

ヒントの意味が分りませんね。


もしかすると誤記で、ageではなくnameのソート前のコピーを取っておいて、
nameのソート前、ソート後の比較から、ageをソートさせろと言いたいのかもしれません。

この回答への補足

そうかもしれません。

補足日時:2013/03/30 22:00
    • good
    • 0
この回答へのお礼

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int main(){
//nameベクターをつくる
vector<string> name;
name.push_back("Taro1");
name.push_back("Taro2");
name.push_back("Taro3");
name.push_back("Taro4");
name.push_back("Taro5");

//ageベクターをつくる
vector<double> age;
double d_age;
for(int i=0; i<name.size(); ++i){
cout << name[i] << " age:";
cin >> d_age;
age.push_back(d_age);
}

//ソート前のnameベクターのコピーをつくる
vector<string> pre_name = name;

//nameベクターをソートする
sort(name.begin(), name.end());

//新しいageベクターをつくる
vector<double> new_age(name.size());
for(int i=0; i<name.size(); ++i){
for(int j=0; j<name.size(); ++j){
if(pre_name[j] == name[i]){
new_age[i] = age[j];
}
}
}

//表示
cout << "ソートしました。\n";
for(int i=0; i<name.size(); ++i){
cout << name[i] << " age:" << new_age[i] << '\n';
}

return 0;
}

こんな感じでいいのでしょうか?

お礼日時:2013/03/30 22:29

> こんな感じでいいのでしょうか?



結果が正しけりゃいいんじゃね?

#include <iostream>
#include <vector>
#include <string>
#include <utility>
#include <tuple>
#include <algorithm>
#include <iterator>

using namespace std;

int main() {
// 5つの名前をvector<string> nameに読み込み、
// 名前が指定された人の年齢をユーザに入力させ、
// 年齢をvector<double> ageに格納せよ。
// ↑メンドクセーので省略
vector<string> name { "chris", "mike", "bob", "andy", "bill" };
vector<double> age { 10, 20, 30, 40, 50 };

// 次に、name[i]とage[i]のペアを5つ出力せよ。
for ( int i = 0; i < name.size(); ++i )
{ cout << name[i] << ':' << age[i] << endl; }
cout << endl;

// 名前をソートしname[i]とage[i]のペアを出力せよ。
// ここで注意しなければならないのは、age vectorの順序を
// ソートされたname vectorと正しく一致させることである。
vector<tuple<string,double>> pairs;
transform( begin(name), end(name), begin(age), back_inserter(pairs),
[](string n, double a) { return make_tuple(n,a);});
sort( begin(pairs), end(pairs),
[](const tuple<string,double>& x, const tuple<string,double>& y)
{ return get<0>(x) < get<0>(y); });
for ( const auto& item : pairs )
{ cout << get<0>(item) << ':' << get<1>(item) << endl; }
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!