나는 mask라는 uchar 배열을 가지고 있습니다. 그것은 0 또는uchar 배열로 C++ 벡터 마스킹
uchar mask
1. 나는 STL 벡터에게 마스크의
vector<MyClass> vec
크기를 가지고 VEC가 같은 포함되어 있습니다.
마스크가 될 수있는 한
나는 mask라는 uchar 배열을 가지고 있습니다. 그것은 0 또는uchar 배열로 C++ 벡터 마스킹
uchar mask
1. 나는 STL 벡터에게 마스크의
vector<MyClass> vec
크기를 가지고 VEC가 같은 포함되어 있습니다.
마스크가 될 수있는 한
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);
또는 사용 :
I는 벡터 인플레 이스 부분 "필터링"하는 같은 간단한 방법은 readptr-writeptr 관용구 인 자체 할당을 감지하지 못합니다.
대상이 다른 벡터가 다음 명시 적 루프 인 경우 :
for (int rp=0,n=src.size(); rp<n; rp++) {
if (<condition>) {
dest.push_back(src[rp]);
}
}
내 의견에 condition
부분도 사용하는 인덱스를 사용할 수 있도록하지 않는 copy_if
및 back_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 인 위치를 기본 콘텐츠를 원하지 않는 경우
그가 가면을 사용하고 있다는 사실을 감안할 때, 진료실을 유지할 필요가 있다고 생각합니다. –
@EdS .: 사실 ... 분명히하기 위해 조금 reworded. – 6502
, 다음은 다음과 같이 간단하다 :
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();
});
'operator'를 사용하는 것에 비해'transform'을 사용하는 것의 이점은 내용이나 마스크가리스트 일 때 여전히 작동한다는 것입니다. – Edmund
마스크가 '0'인 곳에서 기대할 수있는 것은 무엇입니까? –