2016-08-09 6 views
-1

동일한 양의 요소가있는 벡터가 있어야합니다. 조건에 따라 첫 번째 벡터의 요소를 제거하고 싶지만 같은 위치에있는 요소를 두 번째 벡터에서 제거하고 싶습니다.첫 번째 벡터의 요소를 기준으로 두 개의 std :: vectors에서 요소를 제거하십시오.

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

그리고 내가 원하는 것은 요소가 "하나"인 경우 조건에 따라 제거하는 것입니다 :

는 예를 들어, 다음 두 벡터이다.

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

두 벡터에 대해 하나의 색인을 사용해야하는 색인 ​​생성에 'for' 루프를 사용할 수 있습니다. 이렇게하면 같은 인덱스에있는 두 벡터를 모두 지울 수 있습니다. –

+0

이렇게하는 한 가지 방법은 Boost의 zip 반복자를 사용하는 것입니다. - 또는 http://stackoverflow.com/a/26659114/241631 – Praetorian

답변

6

데이터 구조를 변경하는 것이 좋습니다.

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); 
    } 
}