벡터 크기 조정 - 휴대용 휴대용 방법
-
03-07-2019 - |
문제
나는 알고있는 요소의 양 (n)을로드하는 벡터가 있습니다.
처리는 동적으로 새로운 요소를 생성하며 벡터에 추가됩니다.
나는 약 2 * n 추가 요소를 만들 것으로 기대하고 있으므로 벡터를 3 * N으로 크기를 조정합니다.
추가 요소가이를 초과하면 벡터의 동적 확장보다는 프로그램 중단을 원합니다.
AIX/TRU64/LINUX 사이에 휴대 할 수있는 방법을 감지하는 방법이 있습니까?
해결책
무엇을 감지합니까? 벡터가 크기가 크게 지낼 것인지? 그랬 든?
이를 달성하는 유일한 방법은 사용자 정의 할당 자 또는 벡터에 요소를 추가하는 함수에서 확인 기능을 제공하는 것입니다.
예를 들어
template<class T>
void add_element(std::vector<T>& container, T const& v)
{
if (container.capacity()+1 >= 3*N)
{
// terminate/exception/whatever
}
container.push_back(v);
}
다른 팁
벡터를 사용하는 이유는 무엇입니까? 벡터의 요점은 필요할 때 동적으로 확장하는 것입니다.
벡터에 위임하기 위해 클래스를 만드는 대신, 단순한 배열로 위임하기 위해 클래스를 만드십시오. 푸시 _back 크기를 확인하고 필요할 때 중단하십시오.
벡터에 위임 할 자신의 수업을 만듭니다. 자신의 푸시 _back에서 크기를 확인하십시오.
컴파일 시간에 크기를 알고 있다면 std :: tr1 :: 배열을 사용 할 수 있습니다 (또는 부스트 :: 배열)가 더 나은 선택이 될 것입니다. 고정 크기를 유지하고 std :: 벡터와 같은 액세스를 확인합니다.
그러나 런타임에만 그것을 알고 있다면, 여기에서 다른 사람들과 같이, 당신은 원하는 조건을 확인하는 특정 기능을 갖춘 클래스에서 벡터를 캡슐화해야합니다 (예 : 어설 션을 통해).
이 마지막 접근법에서 벡터 생성에서 최대 크기를 알 수 있다면 캡슐화 클래스 생성자 (또는 초기화 함수)에서 벡터의 최대 크기를 예약 (std :: vector :: Reserve ())에게 제안합니다. . 이렇게하면 벡터 자체에 의한 더 이상 메모리 조작이 없을 것입니다 (벡터 요소 생성자/파괴자가 그러한 조작을하는 경우에만). 그런 다음 벡터 용량 (std :: vector :: paction ())이 클래스의 모든 기능의 시작과 끝에서 결코 변하지 않았는지 확인하는 간단한 주장을 추가하면 클래스의 모든 기능이 메모리가 움직이지 않도록하는 데 도움이됩니다.
예를 들어 (data_max_size가 어딘가에 정의 된 기본 최대 크기라고 가정) :
template< typename MyType >
class MyData
{
public:
MyData( unsigned long max_size = DATA_MAX_SIZE )
: m_max_size( max_size )
{ m_data.reserve( m_max_size ); }
void add( const MyType& value ) { check_capacity(); m_data.push_back( value ); check_capacity(); }
private:
std::vector< MyType > m_data;
const unsigned long m_max_size;
void check_capacity() { if( m_data.capacity() != m_max_size ) throw Exception("Useful error message here!" ); }
};
또는 그런 것 ...
STD 클래스는 요소를 삽입 할 때마다 호출 된 할당자를 사용합니다. STD :: Alocator에서 새로운 할당자를 작성하고 필요한 모든 수표/추적을 추가 할 수 있습니다.
(전에는 이것을했지만 작업 코드를 만드는 데 시간이 걸렸습니다.)