2011-10-12 6 views
0
static std::map <unsigned int, CPCSteps> bestKvariables; 

inline void copyKBestVar(MaxMinVarMap& vMaxMinAll, size_t& K, std::vector<unsigned int>& temp) 
{ 
    // copy top k variables and store in a vector. 
    MaxMinVarMap::reverse_iterator iter1; 
    size_t count; 
    for (iter1 = vMaxMinAll.rbegin(), count = 0; iter1 != vMaxMinAll.rend()&& count <= K; ++iter1, ++count) 
    { 
     temp.push_back(iter1->second); 
    } 
} 

void myAlgo::phase1(unsigned int& vTarget) 
{ 

    CPCSteps KBestForT; // To store kbest variables for only target variable finally put in a global storage 
    KBestForT.reserve(numVars); 
    std::vector<unsigned int> tempKbest; 
    tempKbest.reserve(numVars); 
    ....... 
    ....... 
    copyKBestVar(mapMinAssoc, KBestSize, tempKbest); // Store k top variables as a k best for this CPC variable for each step 
    KBestForT.push_back(tempKbest); 
    ..... 
    ..... 
    bestKvariables.insert(make_pair(vTarget, KBestForT)); // Store k best in a Map 
    ..... 
    .... 
} 

문제점 : 맵 "bestKvariables"는 첫 번째 요소를 덮어 쓰지 않지만 나머지 요소는 계속 업데이트합니다. 디버깅을 시도했지만 삽입 명령에 문제가 있습니다.지도 삽입 실패 : 첫 번째 요소를 덮어 쓸 수 없습니까?

도움을 주셔서 미리 감사드립니다.

다른 질문 : 처음에는 삽입 비용을 피하기 위해지도 크기 (예 : vector.reserve (..))를 예약 할 수 있는지 여부.

불충분 한 정보를 제공해 주셔서 감사합니다.

4 개의 vTarget 변수 1, 2, 3, 4가있는 경우를 의미합니다. 각 변수에 대해 통계 계산을 수행합니다. 이러한 변수에 대한 반복이 두 개 이상 있습니다. 다음 반복을 사용하기 위해 각 변수의 상위 k 개 결과를 맵에 저장하고 싶습니다.

삽입 된 첫 번째 변수 (키 unsigned int "vTarget"포함)가 다음 반복에서 업데이트되지 않습니다 (첫 번째 반복에서 삽입 된 값으로 남아 있음). 그러나 다른 변수 (첫 번째 키 다음에 삽입 된 키)는 업데이트 된 상태로 유지됩니다.

+2

첫 번째 요소를 덮어 쓰지 않고 나머지 요소를 계속 업데이트한다는 것은 무엇을 의미합니까? 어쩌면 예를 들거나 기대 한 바를 설명 할 수 있습니다. –

+0

질문 서식 지정 ... 도움이 – sehe

+0

지도 하나의 고유 키당 하나의 값만 저장할 수 있습니다. 아마도 두 개의 키가 같을 수 있다면 multi_map이 필요할 것입니다. – visitor

답변

1

map::insert은/업데이트 아무것도을 덮어 단지 하지 아직 존재하는 요소를 삽입 안된다. 업데이트에는 operator[]을 사용하고 지정된 키가 아직없는 경우 요소를 삽입합니다.

+0

고마워,하지만 핵심은 "vTarget", bestKvariables.insert (make_pair (vTarget, KBestForT)); 부호없는 정수 vTarget; – DataMiner

+0

@ user986789 ?? 나는이 주석으로 당신이 나에게 무엇을 말하려고하는지 모르지만'bestKvariables [vTarget] = KBestForT; 할 때 어떤 일이 일어나는가? – leftaroundabout

+0

고맙습니다. 지금 작동합니다. – DataMiner

3

다른 질문 : 처음에는 삽입 비용을 피하기 위해지도 크기 (예 : vector.reserve (..))를 예약 할 수 있는지 여부.

std::mapstd::vector 달리 reserve() 기능이 없습니다.
일반적으로 표준 라이브러리는 좋은 성능을 제공하고 보장하거나이를 달성 할 수있는 방법을 제공하는 컨테이너에 기능을 제공합니다.

std::vector과 같은 컨테이너의 경우 해당 스토리지를 다시 할당하면 매우 많은 비용이 발생할 수 있습니다. 작업. push_back()에 대한 간단한 호출은 std::vector의 모든 요소를 ​​새로 할당 된 메모리 블록에 복사 할 수 있습니다. reserve()에 대한 호출은 std::vector에 대한 이러한 불필요한 할당 및 복사 작업을 피할 수 있으므로 이에 대해서도 동일하게 제공됩니다.

std::map은 단순히 새로운 요소가 삽입되거나 제거되었으므로 기존/나머지 요소를 모두 복사 할 필요가 없습니다. 따라서 그러한 기능을 제공하지는 않습니다.

표준이 std::map 예상 동작을 구현해야 원하는 복잡성 요소를 필요로 std::vector가 연속 메모리 위치에 할당 할 수는 달리 대부분의 구현이하는 tree로 구현되도록하는 방법을 지정하지 않지만

.

관련 문제