나의질문답

c소스 질문있습니다...

예쁜꽃이피었으면 2014. 8. 20. 15:48

http://www.okjsp.net/seq/258932


c++소스 이긴 합니다만 질문드리고 싶습니다..
ㅜ.ㅠ
map을 만들고 안에 값는 넣는 부분입니다.
map < string , vector<float>> 이렇게 생긴 map이고요..
예를들어 출력화면이 

사과 => 10

사과 => 15

사과 => 23

배 => 12

배 => 35

배=> 26

이런 식일 때, (key값이 중복됩니다.)

바꾸고 싶은건  

사과 =>48         (10+15+23)

배 => 73           (12+35+26)
이렇게 (key값이 중복일 때 value값을 더한다. )



일부 소스입니다.
if( matchPlants.find(plant) == matchPlants.end() ) {
printf("[식물이름]: %s" , plant);
matchPlants.insert (map < string , vector<float>> :: value_type (plant , matchRate));
}
else{
addmatchRate = addmatchRate + matchRate;
matchPlants[plant].push_back(addmatchRate);
}

제가 도움을 좀 받았으면 싶은 부분은 else입니다..
matchRate를 더하고 싶은데 출력을 해보면 전혀 더해지지가 않고 있습니다.
이 더한값(key가 같은 때 value의 합)이
value로 들어 갔으면 좋겠습니다..

선배님분들의
도움을 좀 받을 수 있을까 싶어서 글을 올립니다.




=>답1

Map 키값을 중복으로 넣을수 있나요?

=>1.내 답

map으로 했다가 말씀하신 key값 중복 때문에 multimap으로 변경했다가 

value의 자료형을 vector로 주면 된다고 하길래 map으로 다시 선언했습니다.. 


음..key값이 중복될 때 value의 값을 더하고자 하는 것인데요... 

이렇게 할 수 없는건가요?




=>답2

push_back 할 자료형이 vector 라야지요. 과일별로 개별 값도 보관해야 하고 합산된 값도 필요한 거라면 다른 자료형을 사용해야 할 것 같네요. 단순히 과일별 합산 값만 필요한 경우면 map<string, float> 로 쓰면 될 거고요..

=>2.내 답

그럼 else부분에서 이미 입력된 matchRate을 어떻게 받아 올 수 있나요??

=>답2-1

find 에서 찾은 iterator 를 사용하면 되죠..




=>답3

map < string , vector<float>> values; 

map["사과"].push_back(10); 

map["사과"].push_back(15); 

map["사과"].push_back(23); 

map["배"].push_back(12); 

map["배"].push_back(35); 

map["배"].push_back(26); 


최종 합을 출력할 때, 

float sum; 

for(auto itr = map["배"].begin(); itr != map["배"].end(); ++itr) { 

sum+= *itr; 

cout << (boost::format("합: %f\n") % sum).str(); 


코드는 실제 테스트는 안 해봤지만 대강 이런 식입니다. C++ 표준 2011 이하라면 auto 부분을 해당 const_iterator로 수정해서 구현하시길.. 지나 가다 옛날 생각나서 적고 갑니다.


======

아참 변수명을 values로 했는데 map에다 넣는 식으로 적었으니 values["사과"].push_back(10); 이런 식으로 적으시길..

======

그리고 본 질문에서 find("키")를 수행해서 해당 키가 존재하면 iterator에 해당 개체가 담기므로 이런식으로 구현하셔야 합니다. 

auto itr = values.find("사과"); 

if(values.end() == itr) { 

사과가 존재하지 않는 경우의 코드 

} else { 

사과가 존재하는 경우 위의 코드 예에서와 같이 sum을 구해서 출력합니다. 

}



반응형