动态和静态分配的数组元素计算?

时间:2014-02-07 10:28:41

标签: c++ arrays

有没有办法计算动态分配数组中的元素数量?使用静态分配的数组它没有用(它给我堆栈溢出的错误),因为我需要分配一个缓冲区大小来存储100,000个双倍值(100000 * 8 = 800000字节)的数据。无论如何我没有使用静态数组这样做,但实际上我不想在Stack上分配如此大的缓冲区而是Heap将是首选。

所以这就是我所做的。

静态分配的数组,这里的大小就是我实际需要的东西(它确实在这种情况下失败了)但我尝试了一些较小的尺寸,它可以为我工作和打印元素数量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)即某事就像我们为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;

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:1)

如果你真的想要一个类似于c-string的双精度数组表示,你可以将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';
}