Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[2987] [만해] 멀티맵에서의 범위 검색에 대해서
강재호.만해 [greenuri] 1362 읽음    2003-09-30 16:25
안녕하세요 만해입니다.

이번에 아는 선배가 멀티맵 객체를 써야 하는데

잘 모른다고 저보고 예제 몇개 만들어 달라고 해서

만들고 있었는데요

Multi_Map 에 하나의 키에 대해 여러개의 값을 가지는 특성이 있으니깐

범위 검색 그러니간 하나의 키에 대응 되는 모든값을 가져오는

부분의 예제를 만들려다가 막혀 버렸네요

입력, 삭제는 간단한데 이거 넘 어렵네요

김백일님께서 올린 소스를 변경도 해보고

난리를 쳤는데

도저히 모르겠네요

//---------------------------------------------------------------------------
#include <iostream>
#pragma hdrstop
#include <iterator>
#include <functional>
#include <string>
#include <map>
#include <vector>

//---------------------------------------------------------------------------
using namespace std;

#pragma argsused
int main(int argc, char* argv[])
{
    typedef vector<string> vec_str;
    vec_str input_words, output_words;
    input_words.push_back("a");
    input_words.push_back("aa");
    input_words.push_back("b");
    input_words.push_back("bb");
    input_words.push_back("bbb");
    input_words.push_back("bbb");
    input_words.push_back("bbb");
    input_words.push_back("bbb");
    input_words.push_back("c");
    input_words.push_back("cc");
    input_words.push_back("ccc");
    input_words.push_back("cccc");

    typedef map<string, int> freq_map; // 여기서는 map 대신에 hash_map을 써도 좋습니다.
    freq_map freq;
    for (size_t i = 0; i < input_words.size(); ++i)
        // freq에 words[i]가 있으면 1만큼 증가,
        // 없으면 새로 추가하고 빈도를 1로 세팅.
        freq[input_words[i]]++;

    typedef multimap<int, string> invert_freq_map;
    invert_freq_map invert_freq;
    invert_freq_map::iterator start_iterator;
    invert_freq_map::iterator end_iterator;
    invert_freq_map::iterator find_iterator;

    for (freq_map::iterator i = freq.begin(); i != freq.end(); ++i)
        invert_freq.insert(make_pair(i->second, i->first));
             // 단어와 빈도를 거꾸로 해서 multimap에 저장

//    start_iterator = invert_freq.upper_bound(3);
//    end_iterator = invert_freq.lower_bound(3);
    start_iterator = invert_freq.equal_range(3).first;
    end_iterator = invert_freq.equal_range(3).second;
/*
위의 네 라인이 빈도가 3인 키를 통해 검색되는 모든 원소 값의
시작 지점과 종료 지점을 알아 내기 위해 제가 레퍼런스 뒤지면서 테스트한
함수들인데요 뭐가좀 안맞네요
*/
    find_iterator = invert_freq.find(3);
    for (invert_freq_map::iterator i = start_iterator;
        i != end_iterator ; ++i)
        for (int j = 0; j < i->first; ++j) // 빈도만큼 output_words에 삽입
               output_words.push_back(i->second);

    copy(output_words.rbegin(), output_words.rend(),
         ostream_iterator<string>(cout, "\n")); // output_words를 cout에 출력

    output_words.clear();

    for (invert_freq_map::iterator i = invert_freq.begin();
        i != invert_freq.end(); ++i)
        for (int j = 0; j < i->first; ++j) // 빈도만큼 output_words에 삽입
               output_words.push_back(i->second);

    copy(output_words.rbegin(), output_words.rend(),
         ostream_iterator<string>(cout, "\n")); // output_words를 cout에 출력


    return 0;
}

다시 정리 드리면

멀티 맵의 특성인 하나의 키에 대응되는 모든 원소를 가져 올수 있는 방법을 좀 가르켜 주세요

equal_range나 upper_bound, low_bound함수로 제가 구현을 할려고 했는데 안되는군요

고수님들의 도움 바랍니다.

그럼 이만~

+ -

관련 글 리스트
2987 [만해] 멀티맵에서의 범위 검색에 대해서 강재호.만해 1362 2003/09/30
4258     Re:[만해] 멀티맵에서의 범위 검색에 대해서 강재호.만해 1196 2003/10/04
2999     Re:[만해] 멀티맵에서의 범위 검색에 대해서 ... 자답입니다 강재호.만해 1198 2003/10/06
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.