Connected-component labeling algorithm에서 등가물을 저장하고 싶습니다. 기본적으로 하나의 값 (하나의 레이블 ID)에서 여러 값 (이전 값과 동일한 레이블의 ID)으로 맵을 만들고 있습니다.효율적으로 등가물을 저장하는 방법 (연결 구성 요소 레이블 지정 알고리즘에서)?
저는 이미 이와 같은 작업을 수행했지만 실제로는 잘 작동하지 않습니다.
이 방법의 가장 큰 단점은 내가 정면map
의 크기를 선언해야한다는 것입니다
equivalences.at(i).push_back(equivalent_labels_int);
대형에 대한 다음과 (이 충분한 크기이어야한다) :
std::map<unsigned short, std::list<unsigned int>> equivalences;
for(int i = 0; i < MAX_NUMBER_OF_LABELS; ++i)
{
std::list<unsigned int> temp;
temp.push_back(i);
// note that a label is equivalent to itself
equivalences.insert(std::pair< int, std::list<unsigned int>>(i, temp));
}
는 그럼으로 적절한 등가를 추가 크기 (예 : 9999) 초기화 시간은 약 2.5 초.
누구나 더 좋은 아이디어가 있습니까?
고맙습니다. 제발 2 가지를 설명해 주시겠습니까? 1) .at (...) 연산자와'[] 연산자의 차이점은 무엇입니까? 2) 요소의 순서는 신경 쓰지 않고 요소를 중간에서 제거하지 않으므로 '벡터'가 올바르게 적용될 것이라고 올바르게 이해할 수 있습니까? – Patryk
예! '.at' 멤버 함수는 키와 관련된 값을 찾고, 키가 존재하지 않으면'out_of_range' 예외를 던집니다. 키가 있어야 할 때 맵에서 조회를 수행하는 데 주로 사용됩니다. 'operator []'멤버 함수는 또한 값을 검색하지만 지정된 키가 존재하지 않으면 새로운 키/값 쌍을 자동으로 삽입합니다."myMap [myKey]"관용구는 "myKey와 연결된 항목을 검색하여 존재하지 않으면 기본값을 생성"하는 의미로 사용될 수 있습니다. 그리고 네, 아마도이 경우에는'vector'를 사용해야합니다. – templatetypedef