2012-08-10 110 views
2

std :: vector在給定類型內部包含一個連續內存緩衝區,但bools除外。無論如何,通過指定這個緩衝區來構建一個向量,以便不需要對數據進行處理?std :: vector的高效初始化

我有一個C api,它給了我一個特定類型的數據的緩衝區。我希望能夠通過與std :: vector相關的功能操作這些數據,例如std :: vector <> :: iterator,begin(),end()等。

也許你有更好的關於如何使用這些緩衝區的建議,因爲它們很大,我不想複製它們。

api分配內存並提供一個函數,我打電話告訴它再次釋放它。

+3

也許你不知道它,但指針是迭代器。 – 2012-08-10 08:52:12

+1

你是否提供緩衝區給C API來填寫,還是爲它分配內存並將其返回給你? – jcoder 2012-08-10 09:03:50

+0

@JohnB它分配內存並提供一個函數,我打電話告訴它再次釋放它。 – Baz 2012-08-10 09:10:59

回答

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 2012-08-10 09:12:55

+0

@Xeo - 雖然我同意經常只是直接使用緩衝區將是適當的有很多原因不適用。可能有其他想要的矢量成員,使用純迭代器並不那麼容易表達。他可能需要以預期某些成員函數的模板化方法使用該對象。他可能不想跟蹤緩衝區中的'n'。您可能需要確保它被正確處置。 – 2012-08-10 09:16:53

+0

這正是我所做的只會比我的答案寫得更好,我會稍微刪除一些以避免重複而沒有附加信息......您也可以使用該類通過釋放它的析構函數來處理數據的生命週期也給出了另一個很好的理由來做到這一點。 – jcoder 2012-08-10 09:21:12

相關問題