2016-08-09 6 views
-1

同じ量の要素を持つベクトルにする必要があります。私は条件に基づいて最初のベクトルの要素を削除したいと思いますが、同じ位置にある要素を2番目のベクトルから削除したいと思います。例えば最初のベクトルの要素に基づいて2つのstd ::ベクトルから要素を削除します

は、ここでは二つのベクトルです:

std::vector<std::string> first = {"one", "two", "one", "three"} 
std::vector<double> second = {15.18, 14.2, 2.3, 153.3} 

そして、私が欲しいの要素が「1」である場合の条件に基づいて削除することです。最終的な結果は次のとおりです。

std::vector<std::string> first = {"two", "three"} 
std::vector<double> second = {14.2, 153.3} 

私が使用してfirstから要素を削除することができます。

bool pred(std::string name) { 
    return name == "one"; 
} 

void main() { 

    std::vector<std::string> first = {"one", "two", "one", "three"} 
    first.erase(first.begin(), first.end(), pred); 

} 

をしかし、私は同様に第二のベクターから要素を削除する方法を認識していないです。

+0

両方のベクトルに1つのインデックスを使用する必要がある、インデックス付きのforループを使用できます。この方法で、同じインデックスの両方のベクトルから消去します –

+0

これを行う1つの方法は、Boostのzipイテレータを使用することです - http://stackoverflow.com/a/26659114/241631 – Praetorian

答えて

6

データ構造を変更することをお勧めします。 二つの要素を保持するための構造を使用します。今、この2つの要素の一つのベクトルになり

struct Entry 
{ 
    std::string text; 
    double  value; 
}; 

を:
std::vector<Entry> first_and_second;

あなたが与えられたテキストのためのベクトルを検索すると、あなたは両方含む一つの要素を削除することができますテキストと値。

+1

または単に 'std :: multimap ' – ArchbishopOfBanterbury

+0

@ArchbishopOfBanterbury:はい、あなたの提案は選択肢です。 –

2
for(int i = first.size() - 1; i >= 0; i--){ 
    if(first[i] == "one"){ 
     first.erase(first.begin() + i); 
     second.erase(second.begin() + i); 
    } 
} 
関連する問題