PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2009/07/22 14:23:53
Name DEICIDE
Subject C++ 질문입니다. (템플릿 함수 내에서 컨테이너 삭제 연산 사용방법)
안녕하세요, 아까는 어이ㅡ_ㅡ없는 실수로 폐끼쳐서 죄송합니다.
질문글을 올리려면, 코드를 최대한 꼼꼼하게 확인해보고 올리도록 하겠습니다.

이번에는 템플릿 함수 내에서, 컨테이너 삭제 연산을 사용하는 방법에 대해서 질문드리려 합니다.

다음 프로그램은 사용자로부터 벡터를 받아서, 그것을 정렬하고, 일정 값 이하만 출력하는 프로그램입니다.
정렬/검색/출력을 하는 함수 sub_vec를 제네릭 알고리즘화하려 합니다.
제가 생각하는 방법은 사용자로부터 벡터를 받아 이를 정렬하고, 일정 값 이상은 지워버리고 반환하려 합니다.

#include <iostream>
#include <functional>
#include <vector>
#include <algorithm>

using namespace std;

template <typename InputIterator, typename OutputIterator, typename ElemType, typename Comp> OutputIterator sub_vec(InputIterator first, InputIterator last, OutputIterator at, ElemType &val, Comp pred)
{
        InputIterator it;
        sort(first, last);

        first = find_if(first, last, bind2nd(pred,val));
        
        at.erase(first, last);   /////////////////////////////////

        return at;
}


void main(void)
{
        int val=6;
        int iv[10] = {5, 7, 2, 6, 10, 4, 9, 7, 1, 5};
        vector<int>vec(iv,iv+10);
        vector<int>vec2(10);
        vector<int>::iterator iter = vec.begin();
        vector<int>::iterator end_it=  vec.end();
                
        sub_vec(iter,end_it, vec2.begin(), val, greater<int>());
        
        //vec2.erase(

        for(int ix=0;ix<vec2.size();++ix)
        {
                cout<<vec2[ix] << ' ';
        }

}


보시는 바와 같이 //////////////////// 부분의 계산은 당연히 되지 않습니다; at 의 type 이 template 이니까요.
그런데 .erase() 와 같은 연산을 템플릿 컨테이너에서도 실행시킬 수 있는 방법이 없을까요?
sub_vec() 함수를 제네릭 알고리즘으로 유지시키면서 말입니다.
혹시 방법이 있을지... 아니면 그냥 벡터를 main() 으로 넘겨서 main 에서 erase() 해야 하는 것인지...
염치없지만 프로그래밍 전문가분들께 해답을 구합니다~

ThEnd.

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
MoreThanAir
09/07/22 14:41
수정 아이콘
질문에 대한 해답은 아니지만 요즘 STL 관련 질문을 자주 올리시는데요.

현업(?)에서는 STL을 그렇게 자주 사용하지는 않는 것 같습니다.

오히려 C++은 사장될 것이라고 말하는 교수도 있는 상황이고요.

템플릿과 STL을 중점적으로 공부하시는 것 같은데 세부적인 것이 나올 때마다 질문을 하는 것도 좋지만

STL관련 책을 한 번 읽어보심이 어떨까요?

Effective STL 을 추천합니다. 이미 읽어보셨다면 뻘답글이 되겠군요...;
09/07/22 15:01
수정 아이콘
MoreThanAir님// 현재 공부하고 있는 책은 Essential C++ 로 공부중이고요,
목적은 3D 그래픽을 하는데 필요한 Mesh Library 중의 하나인 OpenMesh 를 Maya API 와 연동시키기 위함에 있습니다.
그래서 OpenMesh 가 제공하는 다양한 함수들을 Maya 에서 자유롭게 사용할 수 있도록 해야 하는데
먼저 C++ 에 대한 이해가 선행되어야 하기 때문에 1주 안에 책 한권을 마스터하다시피 해야 해서;;; 좀 무리하게 질문글을 올리고 있습니다.
STL 에 대한 공부는 따로 시간을 들여서 더 해야겠군요... 질문글을 올리면서도 죄송하다는 마음 가득입니다.
MoreThanAir
09/07/22 15:10
수정 아이콘
DEICIDE님// 시간이 촉박할 때는 느긋하게 따로 공부하기가 힘들죠... 씨++을 일주일 안에 모두 이해한다라... 좀 무리한 목표인 것 같습니다. 워낙 개념들이 복잡해서 말이지요. 하시는 일 성공하시고 시간 나면 따로 한 번 공부해 보세요-
09/07/22 15:23
수정 아이콘
iterator 만으로는 어떤 container 소속인지 모릅니다. .erase 를 실행시키려면 당연히 그 본체 (여기서는 vec2) 도 파라미터로 전달해 줘야 합니다.

template<typename container, typename Comp>
container sub_vec( const container& )

// 세부코딩


main()

//~~~
vector<int> vec2 = sub_vec< vector<int>, greater<int> >( vec );


해주면 끝날 것 같은데요?
09/07/22 15:30
수정 아이콘
STL 유용합니다. 그리고 현업에서 많이 쓰입니다. 최소한 STL 을 상속하거나 비슷하게 만든 라이브러리들 많이 씁니다.
따라서 STL 의 기본 개념을 알아서 손해볼 것 없습니다.

C++ 이 사장될거라는 건 금시초문이네요. 이 세상에 C++ 로 짜놓은 라이브러리가 얼마나 많은데... 최소한 15년은 쓸겁니다.

이펙티브 STL 은 STL 을 어느정도 알아야 볼 수 있는 책입니다. 이거로 STL 에 입문할 수는 없습니다. 이펙티브 씨리즈들이 다 그래요.
STL 기본서로 먼저 공부하신 후 읽으세요.
살찐개미
09/07/22 15:37
수정 아이콘
각자 주력언어가 있는것이고 IT업계도 각각의 부류 및 주류가 있는법이라
어떤 언어가 사장될것인다.. 하는 설은 대부분 그쪽 업계에"만" 통용될 수 있다 생각합니다.

저는 GIS업계에서 일하는데 MFC위주로 하던게 요즘은 웹쪽으로 넘어가는 추세구요
그 외에 C도 쓰고 이것저것 하고있습니다.

어떤언어던간에 주력언어를 정하시고 매진하시면 어딜가도 좋은 대접받으실수있을거라 생각합니다.
여자예비역
09/07/22 15:47
수정 아이콘
아직도 포트란, ProC 쓰는 회사도 많은데.. 사장까지는...;;
09/07/22 16:42
수정 아이콘
XEEN님// 좋은 말씀과 정보 감사합니다.
그런데 염치없지만 사실 아직도 정확하게 이해가 가질 않네요.
'template 으로 벡터를 받아서, 이것을 일정부분 삭제하고 다시 반환한다'
를 sub_vec 안에서 실행하기가 아직도 참 애매합니다;
조금 더 공부해보도록 하겠습니다.
MoreThanAir
09/07/22 17:19
수정 아이콘
저도 씨++을 가장 좋아하고 씨++의 그 많은 우아한 개념들을 무척 좋아합니다.

그래서 그 교수의 이야기가 그다지 달갑지는 않았습니다만...

제가 CS 석사 생활을 수년 간 하면서 씨++로 진행하는 수업은 해 본 적이 없습니다.

현업이라고 한건 최근의 석사 과정을 좀 오버해서 나타낸 말이고...

진짜 '현업' 필드에서는 아직까지 여러 언어가 많이 사용되겠죠.

하지만 핵심 코어에서는 씨++을 거의 쓰지 않습니다.

핵심 코어라는 것은 데이타베이스, 네트워크, OS 등등의 최신 프로젝트를 말합니다.

물론 자바, 포트란, 그 외의 여러가지 웹 언어들은 발붙일 틈도 없지요.

리눅스 자체가 씨를 기반으로 한 시스템이고 대부분의 최신 프로젝트가 그 기반 위에서 움직이는지라

씨 말고는 도태되어 가는 느낌이 있습니다.
09/07/22 18:10
수정 아이콘
DEICIDE님// 솔직히 정확히 어떤 걸 원하시는 지 잘 모르겠습니다. vec2 를 써 놓으셨길래 리턴값으로 새로운 vector 를 받기를 원하시는 줄 알았네요. vec 을 받아서 그 놈을 직접 수정하길 원하시나요? 그러면 그냥 아래처럼 하시면 됩니다.

template<typename container, typename Comp>
void sub_vec( container& c )

// 세부코딩
c.dosomething();


main()

//~~~
sub_vec< vector<int>, greater<int> >( vec );


c. 후에 어떤 함수 (정의되어있지 않더라도)가 오던 컴파일 에러는 발생하지 않습니다. 템플릿의 장점이자 단점이죠. 실질적으로 vector 를 받는다기 보다는 어떤 container 도 받을 수 있으므로 generic 하게 되죠. 원하시는 답변인지는 모르겠지만...
09/07/22 18:56
수정 아이콘
음 그러니까 제가 생각한 개념은

step1) vec 을 받아오는데, sort() generic algorithm 을 사용하기 위해 vec.begin() 과 vec.end() 를 iterator 로 받아옵니다.
step2) 그리고 find_if() 를 사용해서 정렬된 값에서 사용자가 입력한 일정한 값을 찾습니다.
step3) 그 뒤의 값을 전부 지워줍니다.
step4) 그리고 나머지 벡터를 넘겨주어 출력합니다.

vec2 를 쓴 것은 step4) 에서 vec2 로 .push_back() 하는 방법으로 데이터를 밀어넣어 주려는 의도였습니다. 미리 벡터의 크기를 정해놓지 않아도 되게끔 말입니다.
그런데 좀 어렵게 느껴지는게 step3) 에서 값을 지워주는 부분이 잘 안되네요; 제가 일단 한번 더 해보겠습니다.
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
60172 자전거를 도난 당했습니다. [10] 아로스아로스1962 09/07/22 1962
60170 마인과 디스럽션과의 관계... [13] ElleNoeR2773 09/07/22 2773
60169 내일 잠실 롯두전 선발이 누구일까요?? [8] 테페리안1506 09/07/22 1506
60168 디카 수리하는데 돈이 얼마정도 들까요?; [2] 도시의미학2108 09/07/22 2108
60167 머리카락과 수염이 자라는 속도는 같을까요? [12] 김군이라네4930 09/07/22 4930
60166 건대입구 데이트장소나 맛집 알려주세요 [3] 5171 09/07/22 5171
60165 CPU관련 질문입니다. [5] 자유와정의3619 09/07/22 3619
60164 그래픽카드 호환 관련 질문입니다 [3] Nalra1491 09/07/22 1491
60163 맞춤법 질문 입니다. [6] 노력하는나1504 09/07/22 1504
60162 그래픽 카드 질문.. [4] 그대가있던계1639 09/07/22 1639
60161 컴퓨터를 구입해야 합니다. 견적서 좀 뽑아주세요.(생짜 초보입니다.) [7] 개스통2062 09/07/22 2062
60160 미디어법에 관해 알고싶습니다. [21] 축구사랑2085 09/07/22 2085
60158 정당을 지지하는 사람들에 대해서 [14] QWERTY1834 09/07/22 1834
60156 [군대]돈을 빌려가서 갚지 않는 고참..... [17] 푸헷3797 09/07/22 3797
60155 메인보드 내장형 그래픽 카드 질문 [6] 인디2096 09/07/22 2096
60154 심전도 측정 질문입니다. [2] 인디2230 09/07/22 2230
60153 저그로 토스전 너무 어렵네요 진짜 몇가지 질문좀 할게욤 [5] 넘사벽2047 09/07/22 2047
60152 맵 파이썬 질문입니다 [5] ??1930 09/07/22 1930
60151 많이 올라오는질문이지만.. 저도 컴퓨터 견적질문좀 할게요.. [2] 언젠가는..1539 09/07/22 1539
60150 C++ 질문입니다. (템플릿 함수 내에서 컨테이너 삭제 연산 사용방법) [11] DEICIDE1652 09/07/22 1652
60149 파워포인트에서 표 크기 질문입니다. [2] 좀참자3088 09/07/22 3088
60148 프랑크푸르트 학파에 대해 좀 공부를 하고 싶습니다. [2] 소인배1696 09/07/22 1696
60147 노트북 추천 좀 해주세요 ^^ [2] 경제학적 마인1625 09/07/22 1625
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로