2012-02-23 2 views
6

C++ 11에서 std :: vector는 생성자가 vector(size_type n)이고 기본값은 n이며 기본 구성 가능, 이동 가능, 복사 불가능 클래스와 함께 사용할 수 있습니다.C++ 11에 vector (size_type n, const Allocator & alloc)가없는 이유는 무엇입니까?

그러나, 다른 모든 벡터 생성자와는 달리 할당을 취하는 변형이 없다, 나는 다음에 의지 한 :

// Foo is default constructible and moveable, but not copyable 
const int n = 10; // Want 10 default constructed Foos 
std::vector<Foo, CustomAllocator> foos(allocator); 
foos.reserve(n); 
for (int i = 0; i < n; ++i) 
    foos.emplace_back(); 

이 작업을 수행 할 수있는 더 나은 방법이 있나요? 특정 이유가 있습니까 vector(size_type n, const Allocator& alloc) 표준에서 생략 되었습니까?

+0

사양에 결함이있는 것 같습니다. 보고서가없는 경우 보고서를 제출하십시오. –

+0

@ NicolBolas에는 신고 접수 프로세스를 설명하는 문서가 있습니까? – rkjnsn

+0

신경 쓰지 마라. 내 게시물보기. –

답변

7

생각한 후에 결국 결함이 아닐 수도 있습니다.

allocator_typevalue_type 외고 는 동일한 유형 것이 가능하다. 이 경우 어떤 기능을 vector(3, alloc)에게 전화 할 수 있습니까? 디폴트 값을 취하여 모든 요소 나 크기와 할당자를 복사 초기화하는 생성자? 이것은 모호하며 컴파일 오류입니다.

+0

Yikes! 나는 내가 그런 생각을했을 것이라고 생각하지 않는다. – rkjnsn

+1

다른 장소 (예 :'std :: tuple')에서 이미 사용되고있는 ['std :: allocator_arg'] (http://en.cppreference.com/w/cpp/memory/allocator_arg)로 쉽게 해결할 수 있습니다. 할당 자 버전은'vector (3, std :: allocator_arg, alloc)'입니다. – Xeo

+3

표준 라이브러리는 종종 템플릿 매개 변수를 사용하여 함수 오버로드에서 같은 수의 매개 변수를 사용하지 않아야합니다. 예를 들어 이것이 궁극적으로 variadic std :: max를 도입하지 않고 초기화 목록을 사용하는 버전을 사용했던 이유입니다. variadic 버전은 사용자 정의 비교를 허용하면서 사용하기 쉬운 방식으로 구현하는 것이 불가능합니다. – bames53

6

첫째, 대신 reserve/루프 꼬추, 당신은 단순히 당신의 상상 생성자는 어떻게 할 것인지 달성하기 위해 resize를 사용할 수 있습니다

const int n = 10; 
std::vector<Foo, Alloc> foos(allocator); 
foo.resize(n); 

을 또 다른 옵션이있는 size_type n 생성자의 세 가지 인수 버전을 사용 :

const int n = 10; 
std::vector<Foo, Alloc> foos(n, Foo(), allocator); 

이 실제로는 또는 상 허용하지 않을 수있는 소자 구조로 복사하더라도.

이유는 무엇입니까? 몰라. 아마 간과했다.

+0

감사합니다. 나는 쉬운 길을 간과해야한다는 것을 알았다. – rkjnsn