문제

가정도 당신을 유지하려면 기존 항목이 있습니다.20%,시간의 항목을 삽입하는 새로운 데이터입니다.이 있는 장점을 하는 std::도::find 다음 std::도::삽입를 사용하는 반환되는 반복기?는 것입니다 아니면 빠른 시도에 삽입한 다음 행위는지에 대한 정보를 기반으로 반복기를 나타내 기록되었거나지 않았습니다.

도움이 되었습니까?

해결책

대답은 당신이 아니합니다.대신 당신이 원하는 무언가를 하는 제목의 24 효과적인 STL by 스코트 마이어스:

typedef map<int, int> MapType;    // Your map type may vary, just change the typedef

MapType mymap;
// Add elements to map here
int k = 4;   // assume we're searching for keys equal to 4
int v = 0;   // assume we want the value 0 associated with the key of 4

MapType::iterator lb = mymap.lower_bound(k);

if(lb != mymap.end() && !(mymap.key_comp()(k, lb->first)))
{
    // key already exists
    // update lb->second if you care to
}
else
{
    // the key does not exist in the map
    // add it to the map
    mymap.insert(lb, MapType::value_type(k, v));    // Use lb as a hint to insert,
                                                    // so it can avoid another lookup
}

다른 팁

이 질문에 대답도에 따라 달라 그것이 얼마나 비싼 가치를 만드는 형식을 저장하는 지도에서:

typedef std::map <int, int> MapOfInts;
typedef std::pair <MapOfInts::iterator, bool> IResult;

void foo (MapOfInts & m, int k, int v) {
  IResult ir = m.insert (std::make_pair (k, v));
  if (ir.second) {
    // insertion took place (ie. new entry)
  }
  else if ( replaceEntry ( ir.first->first ) ) {
    ir.second->second = v;
  }
}

에 대한 가치 등과 같은 유형 int,위 것보다 더 효율적을 찾을 따라 삽입(의 부재에서 컴파일러 최적화).위에 명시된 바와 같이기 때문에 검색을 통해 지도만 한다.

그러나 전화를 삽입하려면 필요 당신은 이미 당신 새로운"value"성

class LargeDataType { /* ... */ };
typedef std::map <int, LargeDataType> MapOfLargeDataType;
typedef std::pair <MapOfLargeDataType::iterator, bool> IResult;

void foo (MapOfLargeDataType & m, int k) {

  // This call is more expensive than a find through the map:
  LargeDataType const & v = VeryExpensiveCall ( /* ... */ );

  IResult ir = m.insert (std::make_pair (k, v));
  if (ir.second) {
    // insertion took place (ie. new entry)
  }
  else if ( replaceEntry ( ir.first->first ) ) {
    ir.second->second = v;
  }
}

하기 위해서 부르는'삽입하는'우리는 지불을 위해 고가의 통화를 구성하는 우리의 가치 유형에서 무엇을 말했는 질문에 사용하지 않습니다 이 새로운 값이 20%의 시간입니다.위의 경우에,변경하는 경우에도 값을 입력하지 않는 옵션은 다음 그것은 더 효율적인을 먼저 수행 찾기''확인하려면 우리가 필요한을 구성 요소입니다.

또,값의 형식을 지도 변경할 수 있습을 저장하는 핸들을 사용하여 데이터를 좋아하는 스마트 포인터의 유형입니다.전화를 삽입하려면 사용 null 포인터이(매우 저렴하게 구성)는 경우에만 필요한 것은 새 데이터 형식으로 구성됩니다.

가 될 것이 거의 모든 차에서 속도 사이의 2,을 찾을 반환됩니다 반복기,삽입 및을 검색하 지도를 결정하는 경우에 이미 존재합니다.

그래서.그것의 개인적인 기본 설정.나는 항상 시도를 삽입한 다음 필요한 경우 업데이트,하지만 어떤 사람들은 좋아하지 않는 처리 되어가 반환됩니다.

나는 생각을 할 경우 다음 찾기 삽입,추가 비용을 것지 않는 경우 키를 찾을 수행하고 삽입 후.It's sort of like 찾는 책을 통해 알파벳 순서 찾을 수 없습니다 책은 다음을 통해 보이는 책을 다시 어디에 삽입니다.귀결하는 방법을 것입 취급에 열쇠 그리고 만약 그들은 끊임없이 변화하고 있습니다.지금 융통성이있다에서는 찾을 수없는 경우,그것을 로그할 수 있습니다,예외 당신이 원하는...

나는 손실에 대답합니다.

을 찾을 반환 지도입니다.end()을 찾지 못하면 아무 것도 의미를 추가하는 경우 새로운 것을 다음

iter = map.find();
if (iter == map.end()) {
  map.insert(..) or map[key] = value
} else {
  // do nothing. You said you did not want to effect existing stuff.
}

은 두 번 느린

map.insert

모든 요소에 대한 이미지도에는 것이기 때문이 있을 검색에 두 번.한 번 보면 그것은 거기에 다시는 장소를 찾을 넣어하는 새로운 것입니다.

에 대한 관심이 있는 경우 효율성을 확인할 수 있습 out 해시 맵<>.

일반적으로 지도<>로 구현되는 바이너리 나무입니다.귀하의 요구에 따라,이 해시 맵 더 효율적일 수 있습니다.

나는 것으로 보이지 않는 충분한 포인트에 코멘트를 남겨지만,틱 대답을 것 같다 긴 호흡을 나-을 고려할 때 삽입하는 반환합니다 반복기 어쨌든,왜 찾 lower_bound 할 때 사용할 수 있습니다 반복자를 반환합니다.이상하다.

어떤 대답에 대해 효율성에 따라 달라집니다 정확히 구현 STL.는 유일한 방법을 알아에 대한 확인을 벤치마킹하는 것입니다 그것은 두 가지입니다.나는 생각의 차이가 될 가능성이 상당한,그래서 결정에 기초한 스타일을 선호합니다.

지도[key]-의 stl 그것을 밖으로 정렬합니다.는 당신의 의도를 가장 효과적으로.

그래,공정한 충분합니다.

만약 당신이 찾는 다음을 삽입 할 수행 2x O(로그 N)을 얻을 때 놓으로 찾을 수 있습니 당신이 알고 있는 경우를 삽입 할 필요가 없는 삽입이 가야(lower_bound 도움이 될 수 있다).다만 바로 삽입하고 그 검토 결과는 방법으로는 이동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top