2011-07-28 3 views
1

"거의 같은"부분으로 벡터를 분할하고 해당 부분에 대한 하위 벡터를 만듭니다.하나의 요소가 적은 벡터 생성자

나는 여기에 원래 질문을했다 : How to split a vector into n "almost equal" parts하지만 난 정말 좋은 해결책을 발견, 내가 사용 여기에서 시도하고있는 무슨 : Best way to extract a subvector from a vector?

내가 시작과 끝 값의 정수를 만들기 위해이 기능을 썼다 (라운드 .) 지정된 자리로 반올림 내 기능입니다

void split(double number, double parts) 
{ 
    double loop = number/parts; 

    for(int i = 0; i < parts; i++) 
    { 
     int start = round(i * loop, 0); 
     int end = round((i + 1) * loop - 1, 0); 
     cout << start << " " << end << endl; 
    } 
} 

이 기능은 지금까지 확인을 작동하지만, 내 문제가 있음을 나는이 실행하려고하면

vector<some> dest(&source[start], &source[end]); 

그런 다음 하나의 LESS 요소를 생성 한 다음 필요합니다. 그때가 99 개 요소가됩니다

vector<some> dest(&source[0], &source[99]); 

로 전화하면 내가 대신의 100 왜 이런 일이, 예를 들면 의미?

어떻게 해결할 수 있습니까? [end + 1]을 사용하면 마지막 벡터에서 "subscript out of range"로 끝납니다.

답변

4

vector 생성자 (및 포인터 범위를 허용하는 모든 STL 생성자)는 다양한 STL 스타일 반복기를 사용하도록 설계되었습니다. 반복자를 사용할 때 첫 번째 요소와 마지막 요소가 아닌 첫 번째 요소와 past-the-end 요소에 대한 포인터를 제공하여 범위를 지정합니다. 다른 vector 밖으로 하위 범위 (0, 99)의 사본으로 vector을 만들고 싶었 경우이가 처음 100 개 요소의 슬라이스를 지정하는 대신에 vector 반복자를 사용하는

vector<some> dest(source.begin(), source.begin() + 100); 

주의를 작성할 수 operator[], 제공된 인덱스가 범위를 벗어날 때 정의되지 않은 동작이 있습니다. 귀하의 경우이 정의되지 않은 동작이 런타임 디버그 오류로 나타납니다. 반복자는 이러한 방식으로 사용되도록 특별히 설계되었으므로이 문제가 없습니다. 당신이 vector 생성자에 대한 입력으로 원시 C++ 배열을 사용하려면

, 당신은 이런 식으로 그것을 할 수 :

vector<some> dest(source, source + 100); 

희망이 도움이! V 인 경우는 &v[n]를 사용하는 것이 불법이지만

+0

좋습니다. 그래서 제 기능을 위해 적절한 호출이 이것입니까? 벡터 dest (source.begin() + start, source.begin() + end + 1); – zsero

+0

'end'가 원하는 마지막 요소의 인덱스라고 가정하면, 맞습니다. 그러나 일반적으로 C++ 컨테이너와 관련해서는 'last'라는 이름이 실제 마지막 요소가 아니라 한 끝을 가리키는 데 사용되므로 'last'와 같은 이름으로 바꿀 수 있습니다. – templatetypedef

+0

감사! 그 'last'라고하는 지금 – zsero

0

n 요소가 포함 된 std::vector는 대신

vector<some> dest(v.begin()+first, v.begin()+last+1); 

last+1 == n 경우 사용할 수 있습니다.

관련 문제