문제

최근에,나는 위험한 아이디어를 나의 머리로 읽은 후에 블로그 포스트를 확인해 보세요.는 아이디어를 표현할 수 있는 다음과 같다:

필요없는 무엇 대부분의 C++표준 라이브러리를 제공합니다.그런데 왜 그렇게 하지 않을 구현 적은 일반적으로,그러나 쉽게 사용하나요?

예를 들어,사용하여 STL 뱉어 다량의 이해할 수 없고 망가 컴파일러에 오류가 있습니다.하지만,나에 대해 걱정하지 않는 할당자,반복기도와 같습니다.그래서 왜 나는 몇 시간을 구현하고 사용하기 쉬운 연결 목록을 반 예를 들어,?

내가 무엇을 알고 싶어에서 유래 사회에는 이것:어떠한 위험이 가능한 단점 및 가능한 이점을 압연"내 자신의"을 위해 기존의 대부분의 기능은 C++?

편집: 내가 느끼는 사람들은 오해 나를 대해 이러한 개념을 파악할 수 있습니다.아이디어를 이해하는지 여부 나를 구현하는 작은 설정의 STL 는 기능을 크게 단순화-상으로 프로젝트에 대해서 가르쳐 주로 데이터 구조와 같습니다.지 않을 제안 다시 발명하 전체에서 휠 땅,그냥 하는 부분이 필요하려에 대해 배울 수 있습니다. 나는 가정 내가 무엇을 알고 싶었는지 여부의 복잡성을 사용하여 STL 보증의 생성,작은 간단한 버전의 자체입니다.

다시 사용하여 부스트 또는 유사한.

대부분의 코드는 대학 및 우리가 사용하도록 허용하지 않은 외부 라이브러리입니다.그래서 그것은 하나의 C++표준 라이브러리,또 내 자신의 클래스입니다.

의 객관성이 질문입니다.

이 질문은 주관적이다.도어야 하는 지역 사회 Wiki 때문에,그것은 설문 조사.내가 원하는 구체적인 인수를 강조하는 장점 중 하나는 또 하나의 단점할 수 있는 가능성 가 발생할 나 접근 방식이다.일반적인 믿음과는 달리,이것은 의견하지만,경험을 바탕으로 또는 좋은 논리적 인수입니다.

형식입니다.

게시는 하나의 단점 장점 중 하나 당 대답이다.이것은 사람들을 평가하는 개인 아이디어를 대신 모든 당신의 아이디어를 한 번에.

고하시기 바랍니다...

아 종교전쟁이 일어났다.나는 팬 소년의 모든 언어입니다.나는 무엇이든지 사용의 적용됩니다.에 대한 그래픽 및 데이터 압축(내가 무슨 일에는 순간에)가 될 것으로 보인 C++.하십시오 제약 당신의 질문에 대한 답변 또는 그들은 닫힌 영역.

도움이 되었습니까?

해결책

그런데 왜 그렇게 하지 않는 나를 구현하는 미만 일반적으로,그러나 쉽게 사용하나요?

기 때문에 당신은 할 수 없습니다.기 때문에 어떤 다른 사람을 말할 수 있는 C++에 대해,그것은 간단한 언어,그리고 당신은 이미 아주 좋은,그것의 링크 목록을 구현됩니다.

솔직히,당신의 선택은 간단하다:

배우 C++,또는 사용하지 않습니다.Yes,C++은 일반적으로 사용되는 그래픽지만,Java 는 OpenGL 라이브러리는 너무입니다.그래서는 C#,Python 및 거의 모든 다른 언어입니다.또 C.당신을 사용하지 않는 C++.

그러나 당신이 그것을 사용하는 경우,그것을 배우고 적당하게 사용한다.

당신이 원하는 경우 변경할 수 없는 문자열을 만들고,귀하의 문자열로 const.

와 관계없이 기본 구현,STL 은 놀랍게도 사용하기 간단합니다.

C++컴파일러 오류 읽을 수 있지만,그것은 약간의 연습입니다.그러나 더 중요한 것은,그들이 독점적이지 않 STL 코드입니다.당신은 그들이 상관없이 당신이 무엇을 하고 있는 라이브러리를 사용할.그래서 그들에게 익숙해하는 것입니다.고 만약 당신이 그들에 사용되는 어쨌든,사용할 수 있습니다 STL too.

그 외에,몇 가지 다른 단점은:

  • 다른 하나는 것이 이해 당신의 코드입니다.당신이 질문에 그래서에 대한 std::벡터,또는 양방향 반복기를 모든 사람들을 합리적으로 잘 알고있는 c++응답 할 수 있습니다.요청할 경우 접 내::CustomLinkedList,아무도 당신을 도울 수 있습니다.는 불행한 일이기 때문에,회전 당신의 자신도 의미가 있다는 것이 더 버그에 대한 도움을 요청니다.
  • 당신은 노력하고 치료하는 증상이기보다는 원인입니다.문제입니다 당신이 이해하지 못하는 C++.STL 은 증상입니다.피 STL 지 않는 마술들의 C++코드를 더 잘 작동 합니다.
  • 컴파일러에 오류가 있습니다.네,그들은 불을 읽지만,그들은 그곳에 와있습니다.많은 작업에서 STL 왔으로 손님들이 잘못 사용하는 컴파일러 트리거의 오류에 대부분의 경우입니다.C++에서 그것은 매우 쉽게 확인하는 코드를 컴파일하지만,작동하지 않습니다.또는 작동하는 것 같다.또는 작동 내 컴퓨터에서 실패하면 신비습니다.당신의 자신의 링크 목록을 것이 거의 확실히 더 많은 이동 오류를 런타임,그들은 어디 가 감지되지 않은 잠시 동안,그리고 훨씬 어렵습니다.
  • 그리고 다시 한 번,그것은 버그가 있습니다.신뢰 me.나는 본 적이 아주 좋은 C++프로그래머 쓰기 연결 리스트에서는 C++로 만 버그를 발견한 후에 버그에서 모호한 국경 경우입니다.C++모두 국경 경우입니다.귀하의 링크 목록 핸들을 제외 안전르게 되어있습니까?그것을 보장하는 모든 것이 일관된 상태를 만드는 경우 새로운 노드(그리고 그로 인하여 객체를 호출 형식의 생성자)예외가 발생?지 않는 메모리 누수,즉 모든 적절한 소멸자될 것이라는?것으로 유형-안전합니까?것으로 성능이?의 많은 두통을 처리할 때 쓰는 컨테이너 클래스에서는 C++.
  • 당신이 놓치고 하나는 가장 강력하고 유연한 라이브러리에서,존재에 언어입니다.STL 할 수있는 많은 고통이 될 것입니다 심지어는 자바의 거대한 부풀어 클래스 라이브러리입니다.C++어렵다 이미 충분히 할 필요가 없을 던져 몇 가지 이점을 제공합니다.

나는에 대해 걱정하지 않는 할당, 반복기도와 같은

할당자 안전하게 무시할 수 있습니다.당신은 꽤 많지 않아 심지어는 것을 알 필요가들이 존재합니다.반복기는 화려한지,그리고 그들을 알아내는 것은 당신의 많은 두통이다.가는 세 가지 개념을 이해할 필요가 사용하는 STL 효과적으로:

  • 컨테이너당신은 이미 알고에 대한 이들.벡터,연결 목록,지도,집합,큐 및니다.
  • 반복기:추상화된 탐색할 수 있도록 컨테이너(또는 하위 집합의 컨테이너의 또 다른 어떤 순서의 값이 메모리에서 디스크에서 스트림의 형태로,또는 계산 즉석에서).
  • 알고리즘:일반적인 알고리즘에서 작동하는 한 쌍의 이터레이터입니다.를 정렬하고,람다 식 찾,복사하고 많은 다른 사람입니다.

Yes,STL 해 자바 라이브러리,처럼 보이지만 놀라운 금액의 전력을 결합하면 위의 3 개념이 있습니다.가의 비밀이기 때문에,그것은 특별한 라이브러리입니다.그러나 만약 당신이 지출하는 것보다 더 많은 하루 두 C++,그것의 가치가 있는 학습니다.

그리고,나는 다음과 같은 형식으로 대답하기 때문에,나는 생각은 실제로 당신을주는 자세한 답변을 더 도움이 될 것이라고.;)

편집:

그것은 유혹하는 말의 활용 롤 자신을 배울 것이 이상의 언어,그리고 어쩌면 왜 STL 은 하나의 은혜를 절약..하지만 난 정말 납득 그것은 사실입니다.그것은 작동 할 수 있지만,그것은 역화할 수 있도.

위에서 말한 대로,그것은 쉽게 C++코드를 작성하는 작동합니다.고 이 작업을 중지 할 때,그것은 쉽게 다시 정렬하는 몇 가지,다음과 같은 선언문의 변수에 삽입하거나 비트 패딩의 클래스에서,그것을 만들 겉보기 다시 작동합니다.당신은 무엇을 배우에서는?것을 가르치는 방법을 쓰는 더 나은 C++?아마도.하지만 대부분의 경우,그것은 단지 당신을 가르치는"C++sucks".그것은 당신을 가르치는 방법을 사용하여 STL?확실히지 않습니다.더 유용한 방법이 될 수 있을 활용하여 멋진 전력의 유래에서 학습 STL 올바른 방법입니다.:)

다른 팁

불리: 아무도 없지만 당신은 그것을 사용할 것입니다.

이점: 이를 구현하는 과정에서 표준 라이브러리가 왜 좋은지 알게됩니다.

장점 : 자신만의 개 푸드를 먹는다. 당신은 당신이하는 일을 정확히 얻습니다.

단점 : 자신의 개 푸드를 먹는다. 우리의 99 %보다 똑똑한 수많은 사람들이 STL을 만드는 데 몇 년을 보냈습니다.

나는 당신이 이유를 배우라고 제안했습니다.

STL 사용은 이해할 수없고 망가진 컴파일러 오류의 림을 제거합니다.

첫 번째

단점 : 당신은 당신 앞에있는 대학 과제를 해결하는 것보다 수업 도서관을 디버깅하는 데 더 많은 시간을 할애 할 수 있습니다.

장점 : 당신은 많은 것을 배울 것입니다!

암호화 컴파일러 STL 오류 메시지에 대해 할 수있는 일이 있습니다. stlfilt는 그들을 단순화하는 데 도움이됩니다. 로부터 stlfilt 웹 사이트:

STL 관련 진단 (및 MSVC 6의 경우 C4786 경고와 해당 이하를 완전히 제거하여 STLFILT가 긴 고상의 C ++ 오류 및 경고 메시지를 단순화 및/또는 재구성합니다. 결과는 가장 비밀 진단을 많이 이해할 수 있습니다.

보세요 여기 그리고 당신이 visualc를 사용하는 경우 여기.

나는 당신이 그것을해야한다고 생각합니다.

나는 이것에 대해 화려하게 될 것이라고 확신하지만, 여기 주변의 모든 C ++ 프로그래머는 너무 많은 STL Coolaid를 취했습니다.

STL은 훌륭한 라이브러리이지만 직접 경험을 통해 자신을 굴리면 다음을 수행 할 수 있다는 것을 알고 있습니다.

1) 특정 사용 사례의 경우 STL보다 빠르게 만듭니다. 2) 필요한 인터페이스 만있는 라이브러리를 작성합니다. 3) 모든 표준 내용을 확장 할 수 있습니다. (std :: string이 split () 메소드를 가졌으며 얼마나 원하는지 말할 수 없습니다) ...

그들이 많은 일이 될 것이라고 말할 때 모두가 옳습니다. 그게 사실입니다.

그러나 당신은 많은 것을 배울 것입니다. 글을 쓰면 STL로 돌아가서 다시는 사용하지 않더라도 여전히 많은 것을 배웠을 것입니다.

단점 : IMHO, 재 구현 테스트 및 입증 된 라이브러리는 토끼 구멍으로, 가치있는 것보다 더 많은 어려움을 겪고있는 토끼 구멍입니다.

약간의 경험 : 오래 전에 나는 그것에 대해 잘 통제해야했기 때문에 나만의 벡터와 같은 클래스를 구현했습니다.

제어가 필요했기 때문에 템플릿 배열을 만들었습니다.

또한 연산자 []를 사용하지 않고 C와 같은 포인터를 늘리면서 반복하고 싶었으므로 각 반복 할 때 t [i]의 주소를 계산하지 않습니다 ... 포인터를 반환하기 위해 두 가지 방법을 추가했습니다. 할당 된 메모리와 끝으로 포인터를 반환하는 다른 메모리에. 정수 배열을 반복하기 위해 나는 다음과 같은 것을 써야했다.

for(int * p = array.pData(); p != array.pEnd(); ++p){
  cout<<*p<<endl; 
}

그런 다음 벡터의 벡터를 사용하기 시작할 때 나는 가능할 때 새로운 메모리를 여러 번 호출하는 대신 큰 기억의 블록을 할당 할 수 있음을 알 수 있습니다. 현재 템플릿 클래스에 할당자를 추가합니다.

그래야만 나는 std :: vector <>의 완벽하게 쓸모없는 복제품을 썼다는 것을 알았습니다.

적어도 지금 나는 왜 내가 STL을 사용하는지 알고있다 ...

또 다른 불리:

대학을 마치면 C ++ 직업을 얻으려면 채용하려는 대부분의 사람들이 표준 C ++ 라이브러리에 익숙 할 것으로 기대합니다. 구현 수준에 반드시 친숙하지는 않지만 사용 및 관용구에 확실히 익숙합니다. 자신의 도서관의 형태로 바퀴를 되풀이하면 그 기회를 놓칠 것입니다. 이것은 당신이 당신의 자신을 굴리면 도서관 디자인에 대해 많은 것을 배울 것이라는 사실에 대한 것이 아니라 인터뷰 위치에 따라 몇 가지 추가 브라우니 포인트를 얻을 수 있습니다.

불리:

당신은 당신의 자신의 새로운 도서관에 의존성을 소개하고 있습니다. 그것이 충분하고 구현이 잘 작동하더라도 여전히 종속성이 있습니다. 그리고 그것은 코드 유지 보수로 당신을 열심히 물릴 수 있습니다. 다른 모든 사람들 (1 년 또는 한 달 안에 자신을 포함하여)은 독특한 문자열 행동, 특별 반복자 등에 익숙하지 않을 것입니다. 리팩토링/연장을 시작하기 전에 새로운 환경에 적응하기 위해서는 많은 노력이 필요합니다. 당신이 STL과 같은 것을 사용한다면, 모두가 이미 그것을 알고, 잘 이해되고 문서화되어 있으며, 아무도 당신의 맞춤형 환경을 다시 배우지 않아도됩니다.

당신은 관심이있을 수 있습니다 Eastl, STL 전자 예술의 재 작성은 잠시 뒤로 문서화되었습니다. 그들의 디자인 결정은 대부분 멀티 플랫폼 비디오 게임 프로그래밍의 특정 욕구/요구에 의해 주도되었습니다. 링크 된 기사의 초록은 그것을 멋지게 요약합니다.

단점 : 당신은 대학 과정이 아마도 이런 식으로 배치되었을 것입니다. 당신이 그것에 의해 충분히 자극을 받았다는 사실 (의도되지 않은 풍자)은 당신이 이용률을 얻지 못하고 있음을 나타낼 수 있으며, 패러다임 전환이있을 때 많은 혜택을받을 것입니다.

이점

MFC를 살펴보면 제안이 이미 생산 코드에 사용되었으며 오랫동안 그렇게되었음을 알 수 있습니다. MFC의 컬렉션 클래스 중 어느 것도 STL을 사용하지 않습니다.

기존 C ++ 라이브러리를 살펴 보지 않겠습니까? C ++가 성숙하지 않았을 때 사람들은 종종 자신의 도서관을 썼습니다. Symbian (꽤 끔찍한), QT와 WXWIDGET (메모리가 저에게 서비스를 제공하는 경우)에는 기본 컬렉션과 물건이 있으며 아마도 다른 많은 것들이있을 것입니다.

내 의견은 STL의 복잡성이 C ++ 언어의 복잡성에서 비롯된 것이며, STL을 개선하기 위해 할 수있는 일은 거의 없다는 것입니다 (보다 현명한 명명 규칙을 사용하는 것 외에는). 가능한 경우 다른 언어로 전환하거나 처리하는 것이 좋습니다.

예를 들어, STL 사용은 이해할 수없고 망가진 컴파일러 오류의 림을 제거합니다.

그 이유는 본질적으로 C ++ 템플릿입니다. 템플릿을 사용하면 (STL처럼) r을 얻게됩니다.이해할 수없는 eam 오류 메시지. 따라서 자신의 템플릿 기반 컬렉션 클래스를 구현하면 더 나은 지점에 있지 않습니다.

템플릿 기반 컨테이너를 만들고 모든 것을 무효 포인터 또는 일부 기본 클래스로 저장할 수 있지만 컴파일 타임 유형 검사를 잃고 C ++는 동적 언어로 짜증납니다. 예를 들어 Objective-C, Python 또는 Java와 마찬가지로이 작업을 수행하는 것은 안전하지 않습니다. C ++가 모든 객체의 모든 내성에 대한 모든 클래스에 대한 루트 클래스와 런타임시 기본 오류 처리에 대한 루트 클래스가 없기 때문입니다. 대신 유형에 대해 틀렸다면 앱이 충돌하고 화상을 입을 가능성이 높으며 무엇이 잘못되었는지에 대한 단서가 주어지지 않을 것입니다.

불리: 상환 모두 그것의 (즉, 높은 수준의 품질에서) 몇 년 동안 많은 훌륭한 개발자들이 필요합니다.

C ++의 기존 기능 대부분에 대해 "내 자신의 롤링"에 대한 위험, 가능한 단점 및 가능한 장점은 무엇입니까?

바퀴를 재창조하는 데 소비 된 노력/시간/돈의 양을 감당하고 정당화 할 수 있습니까?

부스트 또는 비슷한 재사용.

부스트를 사용할 수 없다는 것이 이상합니다. IIRC, 기부금은 대학에서/일하는 사람들로부터 나옵니다 (Jakko Jarvi 생각). 부스트 사용의 상향은 여기에 나열하기에는 너무 많습니다.

'바퀴를 재창조'하지 않고

불리: 당신이 많은 것을 배우는 동안, 당신은 또한 당신의 실제 프로젝트 목표가 무엇인지 생각할 때 자신을 되돌려 놓았습니다.

이점: 이것을 상속받는 사람들은 유지 보수가 더 쉽습니다.

STL은 범용 라이브러리 용이어야하기 때문에 매우 복잡합니다.

STL이 다음과 같은 이유는 다음과 같습니다.

  • interator를 기반으로 표준 알고리즘에는 다른 유형의 컨테이너에 대한 단일 구현 만 필요합니다.
  • 예외에 직면하여 올바르게 행동하도록 설계되었습니다.
  • 멀티 스레드 애플리케이션에서 '스레드'안전하도록 설계되었습니다.

많은 응용 프로그램에서는 다음과 같이 충분합니다.

  • 문자열 클래스
  • O (1) 조회 용 해시 테이블
  • 정렬 / 및 바이너리 검색이있는 벡터 / 배열 정렬 된 컬렉션

당신이 그것을 알고 있다면 :

  • 귀하의 수업은 건축 또는 과제에 대한 예외를 제외하지 않습니다.
  • 코드는 단일 스레드입니다.
  • 더 복잡한 STL 알고리즘을 사용하지 않습니다.

그런 다음 메모리를 적게 사용하고 더 간단한 컴파일/런타임 오류를 생성하는 더 빠른 코드를 작성할 수 있습니다.

STL없이 더 빠르거나 쉬운 몇 가지 예 :

  • 참조 계산 된 문자열 버퍼가있는 복사기 쓰레기 문자열. (참조 카운트 액세스를 잠글 필요가 있으므로 다중 스레드 환경에서는이 작업을 수행하지 마십시오.)
  • std :: set 및 std :: 맵 대신 좋은 해시 테이블을 사용하십시오.
  • 단일 객체로 전달할 수있는 'Java'스타일 반복자
  • 컨테이너의 유형을 알 필요가없는 반복자 유형 (코드의 더 나은 컴파일 타임 디퍼 커플 링)
  • 더 많은 유틸리티 함수가있는 문자열 클래스
  • 벡터 컨테이너에서 구성 가능한 경계를 확인합니다. (따라서 [] 또는 .at는 아니지만 '안전'에서 '빠른'모드로 이동하기위한 컴파일 또는 런타임 플래그와 동일한 메소드)
  • 컨텐츠를 삭제할 객체로 포인터로 작동하도록 설계된 컨테이너.

질문을 업데이트 한 것 같습니다. 이제 실제로 두 가지 질문이 있습니다.

  1. STD :: 라이브러리가 내 요구에 비해 너무 복잡하다고 생각되면 어떻게해야합니까?

내부적으로 관련 STD :: 라이브러리 기능을 사용하여 "무거운 리프팅"을 수행하는 자신의 수업을 설계하십시오. 그렇게하면 틀릴 수 없으며 여전히 자신의 코딩 인터페이스를 발명하게됩니다.

  1. 데이터 구조의 작동 방식을 배우려면 어떻게해야합니까?

자신의 데이터 구조 클래스 세트를 처음부터 설계하십시오. 그런 다음 표준이 더 나은 이유를 알아 내십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top