문제

모든 값을 설정하는 방법 std::map 각 값을 반복하는 루프를 사용하지 않고 동일한 값으로?

도움이 되었습니까?

해결책

C ++는 다음과 같습니다 fill 방법 <algorithm> 그러나 이것은지도에 효과가 없습니다. 실제로, 연관 컨테이너에 대한 알고리즘 지원은 일반적으로 좋지 않습니다.

결과적으로, 당신은 다음과 함께 사용할 적절한 함수를 사용해야합니다. for_each (그러나 나는 이것이 불필요한 간접비라고 생각합니다) :

template <typename TKey, typename TValue>
struct resetter : public std::unary_function<std::pair<TKey, TValue> > {
    TValue const value;

    public resetter(value const& v) : value(v) { }

    public void operator ()(std::pair<TKey, TValue>& v) {
        v.second = value;
    }
};

for_each(map.begin(), map.end(), resetter<Key, Value>(value));

다른 팁

동일한 문제에 직면했지만 Boost :: 어댑터 :: 값이 변하는 범위가 변하기 때문에 std :: fill과 같은 일반 알고리즘과 함께 사용할 수 있음을 발견했습니다.

#include <boost/range/adaptor/map.hpp>
auto my_values = boost::adaptors::values(my_map);
std::fill(my_values.begin(), my_values.end(), 123);

부스트 :: 할당 라이브러리에는 컨테이너의 내용을 초기화하는 데 도움이되는 모든 종류의 깔끔한 것들이 있습니다. 내 생각은지도를 명시 적으로 반복하지 않는 데 사용될 수 있다고 생각했습니다. 불행히도,지도는 호기심 많은 짐승이기 때문에 키가 독특해야하기 때문에 초기화하기가 어렵습니다. 결론은 단순한 루프가지도를 초기화하는 가장 좋은 방법이라는 것입니다. 매우 우아하지는 않지만 작업을 완료하고 STL과의 지인을 가진 사람이 누구나 즉시 이해할 수 있습니다.

map <int,string> myMap;
for( int k=0;k<1000;k++)
  myMap.insert(pair<int,string>(k,string("")));

이 게시물의 나머지 부분은 위의 결론에 도달하기 위해 내가 한 여정을 설명합니다.

부스트 :: 할당을 통해 적은 수의 값을 맵에 할당하는 것이 간단합니다.

map<string,int> m; 
insert( m )( "Bar", 1 )( "Foo", 2 );

또는

 map<int,int> next = map_list_of(1,2)(2,3)(3,4)(4,5)(5,6);

동일한 값으로 전체 맵을 초기화하려는 경우 유틸리티 반복 및 반복 _fun이 있습니다.
이와 같은 것은 멀티 맵 (테스트되지 않은 코드 스 니펫)에서 작동해야합니다.

pair<int,string> init( 0,string(""));
multimap <int,string> myMap = repeat(1000,init);

Konrad Rudolph가 지적한 것처럼, 키는 고유해야하기 때문에 정확한 값의 맵을 초기화 할 수 없습니다.

이것은 삶을 훨씬 더 복잡하게 만듭니다 (재미?). 아마도 다음과 같은 것 :

map <int,string> myMap;

struct nextkey
{
   int start;
   nextkey( s ) : start( s ) {}
   pair<int,string> operator () ()
{
   return pair<int,string>(start++,string(""));
}
};

myMap = repeat_fun(1000,nextkey(0));

이제 이것은 너무 복잡해지고 있습니다. 이제 간단한 반복이가는 길이라고 생각합니다.

map <int,string> myMap;
for( int k=0;k<1000;k++)
  myMap.insert(pair<int,string>(k,string("")));
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top