벡터처럼 중첩되지 않은 컨테이너에서 삭제할 때, 나는 다음과 같은 것을하고있다.중첩 된 컨테이너에서 삭제하기 위해 지우기를 삭제 하시겠습니까? (바깥 쪽 삭제, C++ STL)
struct is_to_remove
{
is_to_remove(dynamic_bitset<>& x) : x(x) {}
const bool operator()(unsigned int id)
{
return x[id];
}
private:
dynamic_bitset<> x;
};
inline static void remove_elements_in_vector(vector<unsigned int>& vec, boost::dynamic_bitset<>& to_remove)
{
// use the erase-remove idiom to remove all elements marked in bitset
vec.erase(remove_if(vec.begin(), vec.end(), is_to_remove(to_remove)), vec.end());
}
이것은 소위 erase-remove idiom이다.
이제, 두 번째 데이터 구조 vector<vector<unsigned int> >
또는 deque<vector<unsigned int> >
, 어디 비트 집합에 따라 자체 내부 컨테이너의 외부 컨테이너 요소를 삭제하려면 원하는.
- 이 중첩 된 컨테이너 유형에 지우기 제거 관용구를 사용할 수 있습니까?
- 그렇다면 어떻게 가능합니까?
- 제한 사항이 있습니까? (예 : vec의 vec는 가능하지만 vec의 deque는 아닙니다)?
내 첫 번째 순진한 접근 방식은 다음과 같습니다. 나는 remove_if가 요소를 순차적으로 반복하고 순차적으로 요소를 결정하고 하나씩 결정한다고 가정했습니다. 그것은 잘못된 가정입니까?
struct is_to_remove_new
{
is_to_remove_new(dynamic_bitset<>& x, unsigned int index) : x(x), index(index) {}
const bool operator()(vector<unsigned int> & vec)
{
return x[index++];
}
private:
dynamic_bitset<> x;
unsigned int index;
};
inline static void remove_elements_in_vectorvector(vector<vector<unsigned int> >& vec, boost::dynamic_bitset<>& to_remove)
{
// use the erase-remove idiom to remove all elements marked in bitset
vec.erase(remove_if(vec.begin(), vec.end(), is_to_remove_new(to_remove, 0)), vec.end());
}
결과가 잘못되었습니다. 따라서 올바른 해결책을 찾고 있습니다. 나는 내가 보장하지 않는 몇 가지 것을 추측했다고 생각한다. 나에게 기본 질문은 다음과 같다. 제거 할 것인지를 검사 할 내부 컨테이너의 ID를 얻는 방법..
위의 게시 된 순진한 접근 방식은 순차적 처리를 계산하고 가정합니다.
귀하의 도움에 감사드립니다.
Sascha
업데이트 및 경고
벡터 벡터의 경우 Stas 솔루션이 잘 작동합니다. 그러나 deque가 인접한 방식으로 저장되지 않기 때문에이 솔루션은 벡터 deque에 대해 작동하지 않을 것이라고 생각합니다. 이는 펑터에서 인덱스 계산이 실패 함을 의미합니다.
누구든지 확인할 수 있습니까?
작품. 고맙습니다. 시도 할 다음 작업 : 벡터 :-)을 사용하여이 작업을 수행하십시오. –
sascha
더 많은 테스트 후,이 솔루션은 외부 벡터 (연속 보증이 유지되는 경우)에서 작동하지만 외부 큐가 아닌 경우 작동한다고 생각합니다. anybode가 그것을 확인할 수 있습니까? 나는 deque의 non-contiguous 속성 때문에 functor에서 계산 된 인덱스가 잘못되었다고 생각합니다 -> error. – sascha