2012-06-21 123 views
29

有人知道如何定義常量大小的矢量嗎?中等大小的矢量

例如,代替限定

std::vector<int> 

這將是

std::vector<10, int> 

它應該是完全交platformed。也許是一個開源課程?

回答

22

性病::載體可以隨時動態地增長,但是有兩種方法可以分配一個初始大小:

這種分配初始大小和填充用零元素:

std::vector<int> v(10); 
v.size(); //returns 10 

這種分配如果你想指定大小的固定編譯時間(ALA std::array<T, N>

std::vector<int> v; 
v.reserve(10); 
v.size(); //returns 0 
+0

,如果它是,被賦予某些用戶定義類型的一個向量初始大小,它會被初始化爲什麼? – simplename

7

使用std::array

爲方便閱讀,可以使的typedef:

typedef std::array<int, 10> MyIntArray; 
+6

當然,由於我們」重新編寫C++ 11,我們會寫'使用MyIntArray =標準::陣列 ;'。 – Tom

34

沒有辦法定義常量大小的矢量。如果你知道編譯時的大小,你可以使用C++ 11的std::array聚合。

#include <array> 

std::array<int, 10> a; 

如果您還沒有相關的C++ 11的支持,你可以使用TR1版本:

#include <tr1/array> 

std::tr1::array<int, 10> a; 

boost::array,因爲已經建議在其他的答案。

+5

雖然知道'array'與'vector'不同,因爲數據包含在對象中。對於10個整數,你可能永遠不會發現其中的差別,但對於大型陣列你可能(例如)通知,他們沒有'O(1)''swap',而大的載體做。 –

+3

另外請注意,像vector一樣,數組沒有'size'和'capacity'的概念。在數組'size' =='max_size'中。也就是說,不能創建大小爲10(即:對於10種可能的元素的空間)的陣列,但僅填充5和期望'size'返回5. –

7

A std::vector是一個動態容器,沒有限制其增長的機制。要分配的初始大小:

std::vector<int> v(10); 

C++ 11有一個std::array,這將是比較合適的:

std::array<int, 10> my_array; 

如果你的編譯器不支持C++ 11考慮使用boost::array

boost::array<int, 10> my_array; 
3

這個---->std::vector<10, int>無效並導致錯誤。但新的C++標準引入了一個新類; std ::數組。你可以聲明一個這樣的數組:

std::array<int, 5> arr; // declares a new array that holds 5 ints 
std::array<int, 5> arr2(arr); // arr2 is equal to arr 
std::array<int, 5> arr3 = {1, 2, 3, 4, 5}; // arr3 holds 1, 2, 3, 4, 5 

std::array有一定的大小,並支持iterator/const_iterator/reverse_iterator/const_reverse_iterator。你可以在http://cplusplus.com/reference/stl/array/找到更多關於這門課程的信息。

6

,:初始大小,但不填充零數組但是您希望能夠在0N之間填充具有不同數量元素的矢量,那麼一個不錯的選項是eastl::fixed_vector

的std ::向量:

一個std::vector的大小是動態的 - 它會動態地分配所需的存儲,並且可以不限制大小和執行一個錯誤。

但是,您可以reserve一定規模,然後添加元素,直到該尺寸之前需要分配新的存儲。

vector.size()是最初爲0,並且隨着添加elementss

的std ::陣列:

一個std::array的大小是一個編譯時間常數 - 這將靜態分配所需的存儲,並且你不能改變尺寸。

array.size()總是數組的大小,並且等於array.max_size()

EASTL :: fixed_vector:

一個eastl::fixed_vector的大小可以是靜態或動態的。

它最初將分配特定數量的元件,然後如果允許動態增長如果需要的話,將動態分配。

對於您最初要求爲宗旨,您可以禁用(在下面的模板實例通過bEnableOverflow)增長

fixed_vector.size()最初是0,並且隨着你添加元素。

template<typename T, 
     size_t nodeCount, 
     bool bEnableOverflow = true, 
     typename OverflowAllocator = 
         typename eastl::type_select<bEnableOverflow, 
                EASTLAllocatorType, 
                EASTLDummyAllocatorType>::type> 
class fixed_vector; 

簡單的例子:

#include <iostream> 
#include <vector> 
#include <array> 
#include "EASTL/fixed_vector.h" 

int main() 
{ 
    std::vector<int> v; 
    v.reserve(10); 
    std::cout << "size=" << v.size() << " capacity=" << v.capacity() << '\n'; 

    std::array<int, 10> a; 
    std::cout << "size=" << a.size() << " capacity=" << a.max_size() << '\n'; 

    eastl::fixed_vector<int, 10, false> fv; 
    std::cout << "size=" << fv.size() << " capacity=" << fv.capacity() << '\n'; 

    return 0; 
} 

輸出:

size=0 capacity=10 
size=10 capacity=10 
size=0 capacity=10 

注意的array大小爲10,而vectorfixed_vector是0