2017-05-24 1 views
-1

タイトルが説明しているように、異なるタイプのベクトル、つまり文字列とintのstd :: removeを使用して異なる結果が得られます。 intのベクトルの場合、関数は期待どおりに動作しており、実際に物理的に要素を削除していません。しかし、それは物理的に文字列のベクトルの要素を削除し、私は理由を理解することができない(それは私が見落としている小さな何かのように感じる)ことはできません。なぜ誰がこれが起こっているのか説明できるなら、それは本当に素晴らしいでしょう。私は以下のコードと出力を掲載しました。ありがとう!異なるタイプのベクトルでstd :: removeを使った結果が異なる

//includes 
using namespace std; 

template <class T> 
void printer(T value) { 
    cout << value << ", " 
} 

int main() { 
    string myvalues[] = { "yyy","Yyy", "yYy","yyY","ZZZ","zZZ", "ZzZ", "ZZz" }; 
    int nums[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; 
    vector<string> v1(myvalues, myvalues + 8); 
    vector<int> v2(nums, nums + 8); 
    sort(v1.begin(), v1.end()); 
    remove(v2.begin(), v2.end(), 7); 
    remove(v1.begin(), v1.end(), "yyy"); 
    for_each(v1.begin(), v1.end(), printer<string>); 
    cout << endl; 
    for_each(v2.begin(), v2.end(), printer<int>); 

    return 0; 
} 

出力:

YYY、ZZZ、ZZZ、ZZZ、YYY、YYY、ZZZ、

1、2、3、4、5、6、8、8、

「yyy」という要素が実際に削除され、最後の要素は空になりましたが、要素「7」は論理的に削除され、最後の要素は変更されませんでした。 STDの基準からの

+1

編集可能なコード。 –

+2

肩甲骨。要素を削除したら、シーケンスは小さくなり、終わりを超えて見てはいけません。 –

+0

出力にダブルカンマがありますか? – rustyx

答えて

1

::削除:返されるイテレータと最後の間 要素が有効ですが不特定な状態で残されている間に除去されない要素の

相対的順序は、保存されます。

したがって、どちらの場合も、関数は「正しく」動作しています。

+0

なぜintとstringの違いか分かりません。おそらく文字列の実装は、空の文字列を使って何らかの種類のスワップを使用していますが、intの場合は次の値を割り当てるだけでしょうか? – user1620443