2017-09-04 11 views
2

unordered_map<string, atomic<int>>으로 만들고 싶습니다. 이것을 사용하여 (fetch_add), 문자열을 기반으로하는 원자 값 (키)을 저장하거나로드합니다. 예를 들어, 정수 원자 카운터가 10 개라고 가정하지만 4 또는 그 값만 가져 오려고합니다.문자열 및 원자 <int> 키 - 값 쌍의 unordered_map을 만들 수 있습니까?

for (auto want: wanted) { 
    cout << myValues[want].load() << endl; 

이를 :

unordered_map<string, atomic<int>> myValues = { 
    {"first", atomic<int>(0)}, 
    {"second", atomic<int>(0)}, ... the last key being "tenth"} 
}; 

을 그럼 난 다음을 수행 싶습니다 내가

vector<string> wanted = {"first", "third", "tenth"}; 

등 문자열의 벡터를 가지고 말 :이 닮은 unordered_map이 좋아하는 것 원하는 키의 값을 출력해야합니다.

이 작업을 수행 할 수 있습니까? 위와 같이 맵을 작성하려고하면 원자에 대한 대입 연산자가 삭제된다는 오류 메시지가 나타납니다. 이것을 할 수있는 방법이 있습니까?

+1

'atomic' 유형을 사용할 수 있습니다 복사가 불가능하거나 움직일 수 없다. – LWimsey

+0

내 접근 방식이 DOA라는 것을 의미합니까? 같은 종류의 일을 수행하는 다른 방법이 있습니까? – Mark

+1

'atomic' 값 (no no!)을 복사하는 대신에 init 데이터를 따로 정의하고 그걸 반복하여 ['emplace'] (http://en.cppreference.com/w/cpp/container/ unordered_map/emplace)를 맵에 추가하십시오. –

답변

1

물론 unordered_map<string, atomic<int>>을 만들 수도 있지만 atomic<T> 개체는 이동하거나 복사 할 수 없으므로 initializer_list 생성자를 사용하여 초기화 할 수 없습니다.

지도의 값을 단일 인수를 사용하여 구성 할 수 있으므로 emplace 멤버 함수를 사용할 수 있습니다. 키/값 유형 생성자가 하나 개 이상의 인수를 취하는 경우

std::unordered_map<std::string, std::atomic<int>> m; 

for(auto const& key : {"first", "second", "third", "fourth"}) 
    m.emplace(key, 0); 

, 복사 및 이동을 방지하기 위해, 당신은 std::pairpiecewise construction constructor을 사용하고 emplace 멤버 함수해야합니다.

for(auto const& key : {"first", "second", "third", "fourth"}) 
    m.emplace(std::piecewise_construct, 
       std::forward_as_tuple(key), 
       std::forward_as_tuple(0)); 

컴파일러는 C++ 17 지원하며 키 유형은 하나의 인자를 사용하여 구성 할 수있는 경우에, 당신은 또한 덜 장황 try_emplace 멤버 함수를

for(auto const& key : {"fifth", "sixth", "seventh", "eight"}) 
    m.try_emplace(key, 0); 
+0

아름답습니다. 고맙습니다. – Mark

+0

왜'try_emplace'인가? 'm.emplace (키, 0);'괜찮아요 (C++ 17 지원없이) – LWimsey

+0

@LWimsey 글쎄, 바보 같지 않았습니까? 분명히 그것을 overthinking의 경우. 이제 해결되었습니다. – Praetorian