2017-01-04 17 views
-2

私には、国、都市、人口のリストがあります。私は、それぞれの国の人々の数が最も少ない都市を見つける必要がある:与えられたC++で配列要素の最大値を見つける方法は?

データ:

Springfield USA 16876 
Xao China 1477555 
Getfield UK 812 
Sheffield USA 18600 
Joji India 5565 
Huffington USA 7891 
Saji India 774 
Pubfield UK 332 
Ming China 4555 
Lao China 502 

結果がでなければなら:

行うための最も効率的な方法何
Huffington 7891 
Lao 502 
Pubfield 332 
Saji 774 

それ?

+0

あなたはアレイを必要としますか?設計におけるプロセスの一部は、データ構造の選択です。私はまず、文字列のマップのために、都市とサイズを含むカスタム構造体のセットに行きます(そして、後者によって順序付けられます)。その後、マップを反復処理することができ、セットは常に注文されます。パフォーマンスの問題がなければ、問題がうまく説明されているので、私はこれを実行します。 – lorro

+0

配列は必要ではありませんが、私は都市の最小値を見つけてそれを取り除くことを試みました。しかし、それは非常に不十分です。 @StephanLechner – Vilius

答えて

2

私は

struct City { 
    std::string name; 
    std::string country; 
    int population; 
}; 
std::vector<City> cities; 

ベクトルを並べ替えるそして、人口に基づいて、それらを並べ替えた後、ベクターにデータを置く:

std::sort(cities.begin(), cities.end(), 
    [](City& a, City& b) { return a.population > b.population; }); 

次に最低の項目を削除します。

EDIT ここでは国によって最も低い集団のベクターを作成する異なるバージョンがあります。この時点で、countriesベクトルルックスを

// Copy 
std::vector<City> countries = cities; 
// Remove duplicates. 
// Note this works in our case because of the way the vector is sorted 
auto it = std::unique(countries.begin(), countries.end(), 
    [](City& a, City& b) { return a.country == b.country; }); 
countries.resize(std::distance(countries.begin(), it)); 

:最小の集団と第二のベクターを作成し、今

std::sort(cities.begin(), cities.end(), 
    [](City& a, City& b) { 
     if (a.country == b.country) { 
      return a.population < b.population; 
     } 
     else { 
      return a.country.compare(b.country) < 0; 
     } 
    }); 

まず、国人口でソートするsortを変更このように:

Lao China 502 
Saji India 774 
Pubfield UK 332 
Huffington USA 7891 
+0

偉大な、ありがとう – Vilius

+1

"各国の"要件のため、まず国別にソートし、各国のセクションを人口別にソートすることをお勧めします。これは、 'std :: sort()'に与えられた比較関数に応じて、指定された国の最初または最後のエントリにその国の最小人口が含まれることを保証します。 –

+1

良いキャッチジャスティン。その答えは実際には要件に従って正しい結果を出すつもりはありません。私はまた、最も効率的な解決法を提供するかどうかも不明です。これが効率に関する些細な疑問であれば、それは多くの議論を引き出すような質問のようなものでしょう。私はそれが正しい答えに近づくのでアプローチに同意しますが、確かに最も効率的であることは保証されません。 – shawn1874

0

あなたが持っている国を事前に知っている場合。

「文字列」と「int」のマップを作成できます。また、マップのサイズと同じサイズの都市の配列も作成できます。

「文字列」は国の名前で、「int」はあなたが国にいる人の数です。

リストを繰り返して、人数が最小であれば各アイテムをチェックします。 を入力し、特定の都市の名前を配列に書き込みます。

関連する問題