나의질문답

equal_range 를 사용하여 key가 같은 value의 평균을 구하고 싶습니다.

예쁜꽃이피었으면 2014. 8. 19. 10:55

http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNO=20&no=941434&ref=941434&page=1

안녕하세요

 
밑에 글에 
 
equal_range를 사용하면 multimap에서 중복된 key의 value를 가져올 수 있다고 알려주셔서 사용해 봤습니다.
 
 
 
for(multimap < string , float>::iterator iter = matchPlants.begin(); iter != matchPlants.end(); ++iter)
// cout << "matchPlants["<<(*iter).first <<"]: " << (*iter).second << endl;
 
int avg = 0;
 
std::pair <std::multimap<string , float>::iterator, std::multimap<string , float>::iterator> ret;
    ret = matchPlants.equal_range((*iter).first);
    std::cout << (*iter).first << " =>";
    for (std::multimap<string , float>::iterator it=ret.first; it!=ret.second; ++it)
std::cout << ' ' << it->second;
    std::cout << '\n';
  }
 
  return 0;
 
 
 
 
 
 
결과는
matchPlants[사과]: 7.30769
사과=> 7.30769 4.23077 7.30769
matchPlants[사과]: 4.23077
사과=> 7.30769 4.23077 7.30769
matchPlants[사과]: 7.30769
사과=> 7.30769 4.23077 7.30769
matchPlants[귤]: 23.0769
귤=> 23.0769 26.9231 100
matchPlants[귤]: 26.9231
귤=> 23.0769 26.9231 100
matchPlants[귤]: 100
귤=> 23.0769 26.9231 100
 
이런식으로 나옵니다. 
 
사과=> 7.30769 4.23077 7.30769
귤=> 23.0769 26.9231 100
 이 곳의 3개의 값의 평균을 구하고 싶은데요.
 
 
std::cout << ' ' << it->second; 에
second값을 누적시켜서..평균을 구하면 되지 않을까 싶은데..
 
sum += second; 이런식으로 해보려고 했는데
second이 정의되어 있지 않다고 뜨길래
선언해주고 실행을 시켜도 값이 전혀 안들어갑니다..
어떻게 하면 value 3개의
값을 더할 수 있나요?
 
답변 부탁드리겠습니다.ㅜㅠ







=> 답1

it 변수는 for 문 안에 선언된 변수이니 it->second 는 for 문 안에서 사용해야겠죠.

 

=> 추가질문

답변감사합니다ㅜㅠ  얼마나 기다렸는지..
 
 
    for (std::multimap<string , float>::iterator it=ret.first; it!=ret.second; ++it){
std::cout << ' ' <<  it->second;
 avg += it;
    std::cout << '\n';
}
}
 
중괄호가 빠져있었어요..
그런데.. 중복된 key값에 해당하는
value값의 평균을 구하고 싶습니다.
그래서 우선 변수에 value들을 저장부터 해보려고 하는데
저 빨간색으로 칠한 부분에서 계속 빨간줄이 생깁니다..
 
c++ 1~100더하기 소스찾아보니까
+=이런식으로 쓰이던데..이 경우에는 안되나요?

 

=>추가질문 답변 1-1

avg += it; 가 아니라 avg += it->second; 여야겠죠.

 

근데 처음 나오는 for 문도 불필요해보이고..전체적으로 문제가 좀 있네요.

 

avg 변수도 int 가 아니라 float 이어야겠구요.

 

C/C++ 기초 공부부터 차근차근 하셔야 할듯 합니다.









=> 답2

멀티맵으로 하지 마시고....

 

그냥 맵으로 하시는게 좋습니다..

 

 

map<string, vector<float> > matchPlants ; 이렇게 하시면

 

equal_range()를 할 필요도 없이 matchPlants[key문자열]에....vector<float>로 저장할수 있습니다....

 

저장은.....

matchPlants["사과"].push_back(7.30678);

matchPlants["사과"].push_back(4.23077);

..

 

 

=>추가지문

아 그렇군요..

제가 잘 몰라서 추가로 질문드립니다..

그럼 vector로 저장된 것을 따로 떼서? 더할 수 있나요?

(key값이 같은 value들의 평균을 구하고 싶어서요..)

저장하는 것의 경우

안에 내용을..일일이 적을 수는 없는데.. 아.. 이건 for문으로 어떻게 하면 될 것 같긴 하네요..

답변 감사합니다!


=>추가질문답

for()문 돌려서 처리하면 됩니다...^^

 

 

좀더 좋은 방식으로는......vector<>에 추가할때에.....

 

vector<>의  [0]인덱스에는 ...... 합계를 저장하는 곳으로 사용하면 좀더 좋겠지요.....

 

map<string, vector<float> >    data;

 

 

data["사과"].push_back(12.3);

data["사과"].push_back(12.3);          // 벡터의 [0]과 [1]에..... 같은 값을 넣죠..

 

data["사과"].push_back(1.33456);    // 벡터의 [2]에 1.33456이 추가되고..

data["사과"][0] += 1.33456;              // [0]에 1.33456 값을 추가함.

 

..............

 

평균은........ float avg = data["사과"][0] / (data["사과"].size()-1)  ;

 

-1은.. [0]번 인덱스는 빼줘야 하니까..

 


반응형