이 작업을 수행 할 수 있지만 깔끔하게 수행하려면 몇 단계를 거쳐야합니다. 먼저 template class
연속 값의 범위를 나타내는 a를 작성하십시오 . 그런 다음 앞으로 template
(가) 얼마나 큰 알고 버전을 array
받는 사람입니다Impl
이 연속 범위 버전에 .
마지막으로 contig_range
버전을 구현하십시오 . 참고 for( int& x: range )
작동 contig_range
내가 구현하기 때문에, begin()
그리고 end()
포인터가 반복자입니다.
template<typename T>
struct contig_range {
T* _begin, _end;
contig_range( T* b, T* e ):_begin(b), _end(e) {}
T const* begin() const { return _begin; }
T const* end() const { return _end; }
T* begin() { return _begin; }
T* end() { return _end; }
contig_range( contig_range const& ) = default;
contig_range( contig_range && ) = default;
contig_range():_begin(nullptr), _end(nullptr) {}
// maybe block `operator=`? contig_range follows reference semantics
// and there really isn't a run time safe `operator=` for reference semantics on
// a range when the RHS is of unknown width...
// I guess I could make it follow pointer semantics and rebase? Dunno
// this being tricky, I am tempted to =delete operator=
template<typename T, std::size_t N>
contig_range( std::array<T, N>& arr ): _begin(&*std::begin(arr)), _end(&*std::end(arr)) {}
template<typename T, std::size_t N>
contig_range( T(&arr)[N] ): _begin(&*std::begin(arr)), _end(&*std::end(arr)) {}
template<typename T, typename A>
contig_range( std::vector<T, A>& arr ): _begin(&*std::begin(arr)), _end(&*std::end(arr)) {}
};
void mulArrayImpl( contig_range<int> arr, const int multiplier );
template<std::size_t N>
void mulArray( std::array<int, N>& arr, const int multiplier ) {
mulArrayImpl( contig_range<int>(arr), multiplier );
}
(테스트되지 않았지만 디자인이 작동해야 함).
그런 다음 .cpp
파일에서 :
void mulArrayImpl(contig_range<int> rng, const int multiplier) {
for(auto& e : rng) {
e *= multiplier;
}
}
이것은 배열의 내용을 반복하는 코드가 (컴파일 시간에) 배열의 크기를 알지 못하기 때문에 최적화 비용이 발생할 수 있다는 단점이 있습니다. 구현이 헤더에있을 필요가 없다는 장점이 있습니다.
a contig_range
를 전달 set
하면 set
데이터가 연속적 (거짓) 이라고 가정하고 모든 곳에서 정의되지 않은 동작을 수행 한다고 가정 하므로 를 명시 적으로 구성 할 때는주의해야합니다 . std
이것이 작동하도록 보장 되는 유일한 두 개의 컨테이너는 vector
및 array
(및 C 스타일 배열입니다!). deque
랜덤 액세스 임에도 불구하고 연속적이지 않습니다 (위험하게도 작은 청크로 연속적입니다!).list
가깝지 않으며, 연관 (정렬 및 비 정렬) 컨테이너는 똑같이 연속적이지 않습니다.
세 가지 생성자 그래서 나는 곳 구현 std::array
, std::vector
기본적으로 기지를 커버하는, 그리고 C 스타일 배열을.
구현 []
도 쉽습니다. for()
그리고 []
그 사이에 원하는 것이 대부분입니다 array
.
std::vector
.