2012-08-10 5 views
2

std :: vector는 bool을 제외하고 주어진 유형에 대해 내부적으로 연속적인 메모리 버퍼를 포함합니다. 어쨌든 데이터의 대처가 필요하지 않도록이 버퍼를 지정하여 벡터를 구성 할 수 있습니까?std :: vector의 효율적인 초기화

나는 특정 유형의 데이터 버퍼를 제공하는 C API를 가지고있다. std :: vector와 관련된 기능을 통해이 데이터를 조작하고 싶습니다. :: vector <> :: iterator, begin(), end() 등

이 버퍼를 어떻게 사용할 지에 대한 제안은 거대하고 복사를 원하지 않습니다.

api는 메모리를 할당하고 내가 다시 호출하도록 알리는 함수를 제공합니다.

+3

어쩌면 당신은 그것을 알지 못 하겠지만 포인터는 반복자입니다. –

+1

C API에 버퍼를 제공하여 기입합니까, 아니면 메모리를 할당하여 반환합니까? – jcoder

+0

@ JohnB 메모리를 할당하고 다시 릴리스하도록 알리는 함수를 제공합니다. – Baz

답변

4

왜 당신은 단지 사용할 수있는 기능을 포함하는 간단한 클래스로 버퍼를 래핑하지 않아도됩니다. 포인터가 반복자라는 사실을 이용하면이 정도면 충분할 것입니다.

template<typename T> 
struct RawBuffer<T> 
{ 
    RawBuffer(T* in_buffer, size_t in_n) : buffer(in_buffer), n(in_n) {} 
    T* buffer; 
    size_t n; 
    T* begin() { return buffer; } 
    T* end() { return buffer+n; } 
    const T* begin() const { return buffer; } 
    cont T* end() const { return buffer+n; } 
    T& operator[](size_t i) { return buffer[i]; } 
    const T& operator[](size_t i) const { return buffer[i]; } 
}; 

이제 좀 벡터처럼 사용할 수 있습니다

RawBuffer<MyObject> values(generate_objects(n), n); 

//Set an entry 
values[1] = MyObject() 

//Or use an entry 
values[1].do_something(); 

//Lets use some std functions on the object. 
std::for_each(values.begin(), values.end(), my_object_fn); 

//Or create a real vector from it 
std::vector<MyObject> values_copy(values.begin(), values.end()); 

당신은 또한 버퍼가 당신은 destrtuctor을 추가하고 기본 복사를 제거해야 다음에 포함 된 메모리를 관리하려면 생성자 및 대입 연산자

+1

그리고 이것을 감싸는 공명은 ...? 그는 단지'buffer [i],'& buffer [0]'과'& buffer [0] + n '을 직접 사용할 수도 있습니다. – Xeo

+0

@ Xeo - 나는 자주 버퍼를 직접 사용하는 것이 적절할 것이라는데 동의하지만 그렇지 않은 많은 이유가 있습니다. 순수한 반복자를 사용하여 표현하기가 쉽지 않은 다른 벡터 멤버가있을 수 있습니다. 그는 특정 멤버 함수를 기대하는 템플릿 메소드에서 객체를 사용해야 할 수도 있습니다. 그는 버퍼와 별도로'n'을 추적하고 싶지 않을 수도 있습니다. 올바르게 처리되었는지 확인할 수 있습니다. –

+0

정확히 내가 뭘 더 나은 내 정보를보다 더 많은 정보를 추가하지 않고 중복을 피하기 위해 제거됩니다 ... 당신은 또한 그것을 해제하는 소멸자를 통해 데이터의 수명을 처리하는 클래스를 사용할 수 있습니다 너무 좋은 이유가 있습니다. – jcoder

관련 문제