有没有办法使用数组填充向量?

Is there a way to fill a vector using an array?

本文关键字:填充 向量 数组 有没有      更新时间:2023-10-16

我正在尝试用我拥有的数组中的整数填充向量,但是当我检查向量的内容时,所有值均为零。

我正在使用 vector.push_back(( 来尝试填充向量,以便它与我需要以特定方式排序的数组顺序相同。

unsigned char* buffer = new unsigned char[size];
std::vector<unsigned char> *data = new std::vector<unsigned char>(size);
fread(buffer, sizeof(unsigned char), size, f);
for(int transfer = 0; transfer < size; transfer += 1){
std::cout << buffer[transfer];
data->push_back(buffer[transfer]);
std::cout << int(data->at(transfer));
}
fclose(f);

当我打印输出时,我可以看到这些值来自缓冲区数组时不为零,但当我从数据向量读取时,它们却不为零。下面是一些示例输出 φ0$0。

std::vector有一个用于此目的的构造函数:

std::vector<unsigned char> data(buffer, buffer + size);

几乎总是应避免new载体。

您正在使用的std::vector构造函数的重载需要初始化向量的元素数量并初始化这些元素(在本例中为0(。

行后

std::vector<unsigned char> *data = new std::vector<unsigned char>(size);

因此,*data包含已设置为零的size元素。

然后使用data->push_back(...),您将在这些size元素之后添加其他元素。您不会覆盖以前的。

要么使用

std::vector<unsigned char> *data = new std::vector<unsigned char>();

默认初始化空向量,或使用

(*data)[transfer] = ...

以在给定位置设置元素。

此外,如果fread读取的数组少于size字节,则程序具有未定义的行为。您需要检查从其返回值中读取的字节数,并且不允许访问data中超出的任何元素,因为您从未初始化过它。

您可以使用以下命令将其初始化为零:

unsigned char* buffer = new unsigned char[size]{};

如果要编写C++,请不要使用 C 库函数,如fread,请使用<fstream>提供的工具,即std::ifstream,而是std::ofstream

同样,这里也不需要动态内存分配。使用自动存储声明变量:

unsigned char buffer[size]{};
std::vector<unsigned char> data(size);

其余语法也简化了:

data[transfer] = ...

最后,如另一个答案中所述,有一个std::vector构造函数将为您执行整个复制循环。但是请注意,我关于未定义行为的论点在使用它时仍然适用。

data定义为自动数组,如

unsigned char buffer[size]{};

仅当size是编译时常量时才有效。如果不是,那么我的这部分建议不适用。但是,在任何情况下都根本不需要使用数组。您可以初始化适当大小(编译时常量或非编译时常量(的std::vector,并通过其.data()方法将其作为缓冲区提供,该方法返回指向基础(连续(存储的指针:

std::vector<unsigned char> buffer(size);
fread(buffer.data(), sizeof(unsigned char), buffer.size(), f);

代码中不需要单独的缓冲区或任何动态分配。您可以创建具有所需大小的std::vector,然后从文件中直接读取到矢量中。std::vector::data成员函数返回指向向量的基础数组的指针,您可以将其传递给fread()函数

std::vector<unsigned char> vec(size);
fread(vec.data(), sizeof(unsigned char), size, f);

理想情况下,您还将检查fread()的返回值,以了解读取了多少元素。