2017-06-17 6 views
-2

どのように独自のサイズを変更し、サイズを変更:のstd ::ユニークとベクトル::何の繰り返しが発生していないことを維持

for(map <string, vector<int> >::iterator it = m.begin(); it != m.end(); ++it) 
    { 
     vector<int>::iterator sz = unique((it->second).begin(),(it->second).end()); 
     (it->second).resize(distance((it->second).begin(),sz)); 
    } 

ベクトルがソートされます。

+3

woopsは、2番目がベクターであることを見落としています。物事はソートされたベクトル上でのみユニークな作品です。ユニークでは、ユニークではない要素がベクトルの後ろに引っ張られ、そのサイズ変更によってそれらがカットされます。また、サイズ変更よりも消去が実行可能になります。 – Incomputable

+0

実際には、そのように入力されるとソートされます。 – nRT

+2

@nRT - 問題はなんですか?あなたの質問には詳細が欠けています。 – PaulMcKenzie

答えて

1

基本的に質問は、ドキュメントを読むことです。


std::unique()

ベクトルの後ろに要素を引っ張ると、第1の非ユニークな要素にイテレータを返します。順に

は次のようになります。...(重複)1 2 3 6:独特の配列を呼び出した後1 1 2 2 2 3 6 6

に変わります。


次に、 distance()は、最初のユニークエレメントから最初の非ユニークエレメントまでの距離であるユニークエレメント数を計算します。 .resize()は、ユニークでない部分をカットします。

.erase(sz, (it->second).end);この場合、使用する方が良いでしょう。また、ループ自体はむしろ奇妙です。

関連する問題