문제

왜 단일 파라미터 생성자인가? std::list<T> 필요합니다 T 기본 구성 가능한 유형이 되려면? 다음 코드가 컴파일되지 않습니다.

struct Foo { // does not have default constructor.
  Foo (int i) {} 
}
int main(void) {
  std::list<Foo> l(10);
}

사용하는 것이 가능해 보입니다 관용구를 구성하고 파괴하십시오 그들이 STD :: 벡터에서 이미 한 것처럼, 목록 클래스를 더 많이 사용하고 있음에도 불구하고.

관련 메모에서 목록에 용량 기능이없는 이유는 무엇입니까? 그러한 함수는 메모리 할당 비용을 지불하고 나중에 오버 헤드를 제거 할 것이라고 주장 할 수 있습니다. push_back 사물. 적어도 두 개의 STL 시퀀스 컨테이너의 인터페이스를 약간 일관성있게 만듭니다.

도움이 되었습니까?

해결책

STD :: 목록에는 이해가되지 않기 때문에 용량 기능이 없습니다. 벡터처럼 크기를 조정할 필요가 없습니다. 용량은 사용 가능한 메모리에 의해서만 제한되며, 쉽게 결정되지 않습니다.

당신이 요청한 것에서, 나는 당신이 실제로 Reserve ()를 원한다고 생각합니다. 그것은 벡터의 일회성입니다. 모든 STL 컨테이너에 걸쳐 모든 기능을 일관성있게 만들어야하는 특별한 요구 사항은 없습니다.

사용자 정의 할당자를 사용하여 동일한 효과를 달성 할 수 있습니다. 마누엘이 제안한 것처럼 부스트를보십시오.

다른 팁

유형을 기본 구성 가능해야한다는 일반적인 요구 사항은 없습니다. 복사 가능하고 할당 할 수 있어야합니다. 코드는 10 개의 항목 목록을 작성하려고 시도하기 때문에 작동하지 않습니다. 어떻게 든 구성해야하므로 기본 생성자를 사용해야하지만이 특정 경우에만 사용해야합니다. 빈 목록을 만들어 추가하면 그러한 요구 사항이 없습니다.

다른 컨테이너에 대해서도 마찬가지입니다. 다음을 컴파일하십시오.

#include <vector>

struct A {
    A( int x ) : z(x) {}
    int z;
};

std::vector <A> a(10);

질문의 두 번째 부분과 관련하여 인터페이스의 일관성이 표준 컨테이너의 주요 설계 기준이 아니라는 것을 알 수 있습니다. 예를 들어 한 유형의 컨테이너가 "드롭 인"대체품이라는 의도는 없습니다. 또 다른. Scott Meyers의 책 "효과적인 STL"의 항목 1과 2에서 이것에 대한 좋은 논의가 있습니다.

Neil은 이미 주요 질문에 대답했습니다.

또한 resize ()를 호출 할 때 기본 생성자가 필요합니다.

당신은 객체에 대한 stl 포인터 목록을 가지고 이것을 우회 할 수 있지만, 나는 이미 당신에게 분명하다고 생각합니다.

관련 메모에서 목록에 용량 기능이없는 이유는 무엇입니까? 이러한 함수는 메모리 할당 비용을 지불하고 나중에 객체를 푸시 할 때 나중에 오버 헤드를 제거 할 것이라고 주장 할 수 있습니다. 적어도 두 개의 STL 시퀀스 컨테이너의 인터페이스를 약간 일관성있게 만듭니다.

여기서 문제가 있다고 생각합니다 STL 목록은 크로스리스트 스 플라이 싱을 허용합니다. 미리 메모리를 할당하려면 수영장 할당 부스트.

그 이유는 n 요소 목록을 구성 할 때 (여기서 n이 생성자에서 사용한 매개 변수) 목록은 n 요소의 구조를 t ()의 사본으로 채우기 때문입니다.

보다 목록에 대한 SGI STL 문서.

왜 std :: 목록의 단일 매개 변수 생성자가 t를 기본 구성 가능한 유형이어야합니까?

이 대조업자는 요소 (매개 변수로 전달하는 번호)로 목록을 작성하기 때문입니다. 각 요소의 값은 기본값입니다. 또한 두 번째 요소 값으로 초기화 될 요소가있는 목록을 작성하기 위해 두 개의 매개 변수가있는 생성자를 사용할 수 있습니다.

관련 메모에서 목록에 용량 기능이없는 이유는 무엇입니까?

목록에 새로운 요소를 추가하는 비용은 벡터의 경우보다 훨씬 적기 때문에 의미가 없습니다.

STD :: Vector에는 그러한 제한이 없습니다. 내 질문은 왜 STD :: 목록에서 동일한 기술 (생성/파괴)을 사용하지 않는 이유입니다.

제한이 아닙니다. 해당 생성자를 사용하지 않으면 기본 이니셜 라이저가 필요하지 않기 때문입니다. 벡터도 마찬가지입니다.

따라서 귀하의 질문은 실제로 "왜 목록에 예비 및 용량 기능이 없습니까?"입니다.

그에 대한 답은 목록에 미리 메모리를 예약 할 이유가 없다는 것입니다. 새 요소를 추가하려면 기존 요소에 대한 재 할당 및 복사가 필요하지 않으며 목록의 내용을 보유하는 메모리가 인접해질 필요가 없으며 반복자는 그렇지 않습니다. 할 때 무효화됩니다 list::push_back().

그 모든 것은 vector<>::reserve(), 새로운 요소에 대한 메모리에 메모리가있는 이유는 vector<> 배치를 수행합니다 new 원시 기억으로.

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