find 메소드를 사용한 후 std :: map을 업데이트하는 방법은 무엇입니까?


91

메서드를 std::map사용한 후 키 값을 업데이트 하는 find방법은 무엇입니까?

다음과 같은 맵 및 반복기 선언이 있습니다.

map <char, int> m1;
map <char, int>::iterator m1_it;
typedef pair <char, int> count_pair;

나는 캐릭터의 발생 횟수를 저장하기 위해 맵을 사용하고 있습니다.

Visual C ++ 2010을 사용하고 있습니다.

답변:


132

std::map::find찾은 요소 (또는 end()요소가없는 경우)에 대한 반복자를 반환합니다 . 그래서 오랫동안 같이 mapconst를하지, 당신은 반복자가 가리키는 요소를 수정할 수 있습니다 :

std::map<char, int> m;
m.insert(std::make_pair('c', 0));  // c is for cookie

std::map<char, int>::iterator it = m.find('c'); 
if (it != m.end())
    it->second = 42;

2
감사. [] 연산자를 사용할 수도 있습니까?
jaykumarark 2010

1
@Jay : 네,하지만 행동이 다릅니다. 참조 문서 가 제공하는 다양한 기능을 . mapmap
James McNellis 2010

3
나는 error: assignment of member 'std::pair<char* const, char*>::second' in read-only object:(
Tom Brito

1
@jaykumarark 예라고 생각하지만이 솔루션의 단점은 map이 두 번째로 항목의 위치를 ​​찾아야한다는 것입니다 (처음에는 find 메서드를 호출하는 것입니다). 동일한 작업의 불필요한 중복입니다.
truthseeker

51

연산자 []를 사용합니다.

map <char, int> m1;

m1['G'] ++;  // If the element 'G' does not exist then it is created and 
             // initialized to zero. A reference to the internal value
             // is returned. so that the ++ operator can be applied.

// If 'G' did not exist it now exist and is 1.
// If 'G' had a value of 'n' it now has a value of 'n+1'

따라서이 기술을 사용하면 스트림에서 모든 문자를 읽고 계산하는 것이 정말 쉬워집니다.

map <char, int>                m1;
std::ifstream                  file("Plop");
std::istreambuf_iterator<char> end;

for(std::istreambuf_iterator<char> loop(file); loop != end; ++loop)
{
    ++m1[*loop]; // prefer prefix increment out of habbit
}

3
귀하의 답변은 실제 질문에 적합합니다. 슬프게도 질문자는이 질문을 명백한 방식으로 요청 (따라서 수락)하지 못했습니다. 그렇기 때문에이 사실에 대해 짧은 진술을하는 것이 더 나을 것이라고 생각합니다. 매우 빨리 "읽는"사람들은 사용 []후 사용 을 제안한다고 믿을 수 있습니다 find(나는 이것이 당신의 의도라고 생각하지 않습니다).
Wolf

음, 암시 적 으로 요소를 삽입 하지 않으려면 '찾기'가 더 나을 수 있다고 생각 합니다. '찾기'를 거부하고 SIGSEGV에 의해 죽는 것이 선호 될 수 있습니다.
이광무 2017-07-06

1
@GwangmuLee end()반복자를 역 참조하는 것은 정의되지 않은 동작이므로 생성 할 필요가 없습니다 SIGSEGV(내 경험상 그렇게 할 가능성이 낮습니다).
Martin York

5

std::map::at멤버 함수 를 사용할 수 있으며 키 k로 식별되는 요소의 매핑 된 값에 대한 참조를 반환합니다.

std::map<char,int> mymap = {
                               { 'a', 0 },
                               { 'b', 0 },
                           };

  mymap.at('a') = 10;
  mymap.at('b') = 20;

1

이미 키를 알고있는 경우 다음을 사용하여 해당 키의 값을 직접 업데이트 할 수 있습니다. m[key] = new_value

다음은 도움이 될 수있는 샘플 코드입니다.

map<int, int> m;

for(int i=0; i<5; i++)
    m[i] = i;

for(auto it=m.begin(); it!=m.end(); it++)
    cout<<it->second<<" ";
//Output: 0 1 2 3 4

m[4] = 7;  //updating value at key 4 here

cout<<"\n"; //Change line

for(auto it=m.begin(); it!=m.end(); it++)
    cout<<it->second<<" ";
// Output: 0 1 2 3 7    

0

이렇게 할 수도 있습니다.

 std::map<char, int>::iterator it = m.find('c'); 
 if (it != m.end())
 (*it).second = 42;

0

다음과 같이 값을 업데이트 할 수 있습니다.

   auto itr = m.find('ch'); 
     if (itr != m.end()){
           (*itr).second = 98;
     }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.