문제

나는 알고있는 요소의 양 (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에서 새로운 할당자를 작성하고 필요한 모든 수표/추적을 추가 할 수 있습니다.

(전에는 이것을했지만 작업 코드를 만드는 데 시간이 걸렸습니다.)

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