有没有办法计算动态分配数组中的元素数量?使用静态分配的数组它没有用(它给我堆栈溢出的错误),因为我需要分配一个缓冲区大小来存储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;
答案 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';
}