2014-02-19 91 views
3

我有一個std::vector<glm::vec3>,我想用float類型從它得到一個數組指針。從std :: vector <glm::vec3>獲取一個數組指針,其類型爲float

如果標準::向量內容是:

std::vector[0] = vec3(0.1f, 0.2f, 0.3f) 
std::vector[1] = vec3(0.4f, 0.5f, 0.6f) 
std::vector[2] = vec3(0.7f, 0.8f, 0.9f) 

那麼這就是數組指針將與指定的當前指數回報:

array[0] = 0.1f 
array[1] = 0.2f 
array[2] = 0.3f 
array[3] = 0.4f 
array[4] = 0.5f 
array[5] = 0.6f 
array[6] = 0.7f 
array[7] = 0.8f 
array[8] = 0.9f 

如果這是可能的,什麼是實現它的最普通的方式是什麼?

+0

定義這3個'vector's創建一個新的'VECTOR'。 – Maroun

+0

但我不想要數據副本 – Qualphey

+1

'float * ptr =&vec [0];'? –

回答

4
std::vector<glm::vec3> vec; 
vec.push_back(glm::vec3(0.1f, 0.2f, 0.3f)); 
vec.push_back(glm::vec3(0.3f, 0.4f, 0.5f)); 
vec.push_back(glm::vec3(0.7f, 0.8f, 0.9f)); 

float *flat_array = &vec[0].x; 

for(int i=0; i<9; i++) 
    std::cout << flat_array[i] << std::endl; 

假設一個GLM :: VEC3包含三個緊湊的花車,你可以得到一個指向第一VEC的第一要素。這個指針可以像數組一樣索引。

請注意,如果glm :: vec3包含雙打或其他成員變量。在這種情況下,指針魔術會失敗。

+0

'glm :: vec3'只包含浮點數,所以它會工作。 'vec [0] .x'和'vec [0] [0]'也可以。 –

+1

kazemakse你可以靜態斷言(sizeofvec3)== 3 * sizeof(float) – NoSenseEtAl

+0

@NoSenseEtAl是的,這是有道理的。不過,我沒有編譯器來測試這個例子:) – kazemakase

1

正如指出的humbletim在評論上述,我會用GLM :: value_ptr在GLM/GTC/type_ptr.hpp

std::vector<glm::vec3> vec; 
vec.push_back(glm::vec3(0.1f, 0.2f, 0.3f)); 
vec.push_back(glm::vec3(0.3f, 0.4f, 0.5f)); 
vec.push_back(glm::vec3(0.7f, 0.8f, 0.9f)); 

float* flat_array = static_cast<float*>(glm::value_ptr(vec.front())); 
std::cout << std::endl; 
for (int i = 0; i < vec.size()*(vec.front().length()); ++i) { 
    std::cout << flat_array[i] << std::endl; 
} 
相關問題