2014-10-24 1 views
1

나는 mask라는 uchar 배열을 가지고 있습니다. 그것은 0 또는uchar 배열로 C++ 벡터 마스킹

uchar mask 

1. 나는 STL 벡터에게 마스크의

vector<MyClass> vec 

크기를 가지고 VEC가 같은 포함되어 있습니다.

마스크가 될 수있는 한

+0

마스크가 '0'인 곳에서 기대할 수있는 것은 무엇입니까? –

답변

1
vector<MyClass> vec2; 
vec2.resize(vec.size()); 
for (int i = 0; i < vec.size(); ++i) { 
    if (mask[i]) 
     vec2[i] = vec[i]; 
} 

단순하게 어디 곳에서 원본 컨텐츠를 포함 VEC에서 서브 벡터를 형성하는 가장 좋은 방법은 무엇입니까. vec2에는 마스크가 0 인 위치에 클래스의 기본 생성 객체가 포함될 것이므로이를 구분할 수있는 방법이 필요합니다.

if (wp != rp) v[wp] = v[rp]; 
wp++; 

요소 "무거운"인 경우 :

int wp = 0; 
for (int rp=0,n=v.size(); rp<n; rp++) { 
    if (<condition>) { 
     v[wp++] = v[rp]; 
    } 
} 
v.resize(wp); 

또는 사용 :

1

I는 벡터 인플레 이스 부분 "필터링"하는 같은 간단한 방법은 readptr-writeptr 관용구 인 자체 할당을 감지하지 못합니다.

대상이 다른 벡터가 다음 명시 적 루프 인 경우 :

for (int rp=0,n=src.size(); rp<n; rp++) { 
    if (<condition>) { 
     dest.push_back(src[rp]); 
    } 
} 

내 의견에 condition 부분도 사용하는 인덱스를 사용할 수 있도록하지 않는 copy_ifback_inserter 물건을 (사용하는 것보다 낫다). 심지어에서

당신이 짧은

std::copy_if(src.begin(), src.end(), 
      [](const X& x) { return <condition>; }, 
      std::back_inserter(dest)); 

<algorithm> 기반 코드는 (적어도 내 눈을 위해) 읽어 이보다이다,하지 테스트의 올바른 위치를 지정하는 람다를 사용할 수 있도록 C++ (11), 컴파일하는데 훨씬 더 오래 걸린다. 코드가 더 좋지 않을 것이고, 컴파일러는 오타를 어디에서든지 만들면 합리적인 오류 메시지 대신에 말도 안되는 3 건의 화면을 생성 할 것이다. C++ 11

버전

for (auto& x : src) if (condition) dst.push_back(x); 

어쨌든 훨씬 낫다. 마스크가 1 인 위치를 기본 콘텐츠를 원하지 않는 경우

+0

그가 가면을 사용하고 있다는 사실을 감안할 때, 진료실을 유지할 필요가 있다고 생각합니다. –

+0

@EdS .: 사실 ... 분명히하기 위해 조금 reworded. – 6502

0

, 다음은 다음과 같이 간단하다 :

vector<MyClass> sub; 
for (size_t i = 0; i < mask.size(); ++i){ 
    if (mask[i]) sub.push_back(vec[i]); 
} 

그렇지 않으면, 당신은 당신의 컴파일러는 C를 지원하는 경우 람다로 변환 + +0를 사용할 수 있습니다.

vector<MyClass> sub; 
std::transform(mask.begin(), mask.end(), vec.begin(), back_inserter(sub), 
    [](const uchar m, const MyClass &c){ 
     return m ? c : MyClass(); 
}); 
+0

'operator'를 사용하는 것에 비해'transform'을 사용하는 것의 이점은 내용이나 마스크가리스트 일 때 여전히 작동한다는 것입니다. – Edmund