2014-02-07 83 views
0

有什麼方法可以計算動態分配數組中的元素數量嗎?使用靜態分配的數組它沒有用(它給了我堆棧溢出錯誤),因爲我需要分配一個緩衝區大小來存儲100,000個雙精度值(100000 * 8 = 800000字節)的數據。無論如何,我沒有這樣做靜態數組,但我真的不想在堆棧上分配這麼大的緩衝區,而不是堆首選。動態和靜態分配數組元素計算?

所以這就是我所做的。

靜態分配的數組,這裏的大小是我實際需要給我的(它肯定會遇到這種情況),但我試過然後用一些較小的尺寸,它爲我工作並打印元素數but this is not what i want i need something which can count how many elements are actually entered by for loop not just return whole size (800010*8)即ie我們爲char buffer[1000],然後爲strlen(buffer)

srand (time(0)); 
double arr[800010]; 
for(int i = 0; i < 100000; i++) 
{  
arr[i] = (rand()%10000)+(134.234*i); 
std::cout<<"is"<<arr[i]<<std::endl; 

} 
int numelements = sizeof(arr)/sizeof(arr[0]); 
std::cout<<"num elements are"<<numelements*8;//multiplied by 8 is size of double; 

動態分配是好的在堆上的內存分配沒問題,但是"num elements are" = 0?如果有人推薦使用std::vector<double>m_vector,請建議我如何將它作爲數組傳遞,因爲m_vector.data()函數僅適用於文本數據,是嗎?或者如果有任何想法我怎麼能計算實際數量的元素?請不要說做100000*8。我正在尋找一些合乎邏輯的方式來做到這一點。

srand (time(0)); 
    double *arr = new double[800010]; 
    for(int i = 0; i < 100000; i++) 
    {  
    arr[i] = (rand()%10000)+(134.234*i); 
    std::cout<<"is"<<arr[i]<<std::endl; 

    } 
    int numelements = sizeof(arr)/sizeof(arr[0]); 
    std::cout<<"num elements are"<<numelements*8; 
+0

什麼不好嗎瞭解矢量?聽起來像矢量是你的問題的確切答案... – John3136

+0

_''m_vector.data()'函數只適用於**文本數據**,是嗎?'_呃,什麼? –

+3

std :: vector有一個函數size(),它會給你的矢量大小。 – sunny1304

回答

4

而不是使用new[]使用std::vector不是分配陣列。它會跟蹤你的尺寸並照顧釋放底層內存。

例如:

std::vector<double> arr(100000); 
for(int i = 0; i < arr.size(); i++) 
{  
    arr[i] = (rand()%10000) + (134.234*i); 
    std::cout << "is" <<arr [i] << std::endl; 

} 

int numelements = arr.size(); 
+0

您能否提一下可用於保存所有元素數據的內容。就像我們用char類型的vector一樣,並使用data()來保存數據元素。 – User

+1

@ user3232405'std :: vector <> :: data()'不意味着用於您想要執行的操作。使用'resize()'和'size()'來分配/確定你想要的'double'項目的數量。 –

1

如果你真的想雙打的陣列的C弦表示你可以存儲爲NaN作爲終止元素:

#include <iostream> 
#include <limits> 
#include <sstream> 
#include <vector> 

std::size_t nan_terminated_length(const double* d) { 
    std::size_t result = 0; 
    while(d[result] == d[result]) ++result; // C++11: std::isnan 
    return result; 
} 

int main() { 
    std::istringstream input("1.0 2.0 3.0"); 
    std::vector<double> buffer; 
    buffer.reserve(1024); 

    double d; 
    while(input >> d) { 
     buffer.push_back(d); 
    } 
    buffer.push_back(std::numeric_limits<double>::quiet_NaN()); 

    std::cout 
     << "Number of elements: " 
     << nan_terminated_length(buffer.data()) 
     << " which is (in this case) equal to the" 
        " size of the vector minus one: " 
     << buffer.size() - 1 
     << '\n'; 
}