2009-12-20 60 views
2

我想創建一個std::vector所以operator[]應該接受long long而非unsigned int,我試着寫我自己的分配器:如何創建64位索引的std :: vector?

template <typename T> 
struct allocator64 : std::allocator<T> { 
    typedef long long difference_type; 
    typedef unsigned long long size_type; 
}; 

但是,當我嘗試以下方法:

long long n = 5; 
std::vector<int, allocator64<int> > vec(n); 
vec[n-1] = 2; 

我得到對於第二和第三行以下警告:

警告C4244:'argument':從'__int64'轉換爲'unsigned int',可能丟失數據

我在想什麼?我認爲operator[]和尺寸構造函數的類型應該來自allocator::size_type

我使用VS9(2008)。

+4

我相信你需要一個編譯器,其中size_t是64位 – KitsuneYMG 2009-12-20 14:52:30

+2

爲什麼你需要超過40億個索引?我認爲你可能需要重新考慮你的設計。 – user230821 2009-12-20 18:18:14

回答

8

也許STXXL庫可以幫助:

STXXL使用的抽象層來存儲 設備以允許最佳 佈局的數據結構提供了一個替換STL 。這個 允許多TB的數據集被保存和操作在標準的 C++數據結構中,而 抽象這種行爲的有效管理的複雜性。 STXXL 利用多磁盤I/O來加速I/O限制計算。 STXXL已在 卡爾斯魯厄大學開發的 。

+0

看起來很有意思...... – Motti 2009-12-20 14:58:17

+0

它確實 - 沒有使用它自己,但它只是一個'apt-get install'在我的Debian盒子裏。對於這樣的基礎設施,我個人不希望花時間重新發明輪子。 – 2009-12-20 15:03:19

+0

這是如何實現指向元素的指針?就更正而言,對於所有的'n 2009-12-20 15:28:26

2

你真的需要存儲的矢量超過numeric_limits<unsigned int>::max()條目?吳

如果沒有,那麼只投N-1,明確詮釋:INT(N-1)

反正說法是vector::size_type類型(而不是分配:: size_type的,據我所知),這通常是size_t的typedef(但不一定是);它可能是4字節或8或其他數量;它是實現定義的。

另見MSDN

+1

至少在visual studio中'vector :: size_type'是'typedef'ed'allocator :: size_type'。看看標準,我現在看23.1'size_type'是實現定義的。 – Motti 2009-12-20 14:56:06

2

提供你的編譯器載體的實施,已經使用了最大的整數類型,它可以有效地[*],通常size_t。假設你在一臺擁有32位地址空間的機器上,並且你說你想要一個具有2^33元素的矢量。沒有辦法可以分配,並且更改參數類型operator[]不會讓計算機分配更大的內存塊。

因此,確保您正在編譯64位Windows的代碼,並且一切都會好的。

[*]這是不是標準的保證。但編譯器編寫者實際上並不喜歡無限制地進行限制,即使它有時是這樣。