有没有一种方法可以使用数组填充向量?

时间:2019-09-07 19:17:59

标签: c++ arrays vector

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

我正在使用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的示例。

3 个答案:

答案 0 :(得分:5)

std::vector为此具有一个构造函数:

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

new几乎总是应避免使用向量。

Live

答案 1 :(得分:3)

您正在使用的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 ++,请不要使用fread之类的C库函数,而应使用<fstream>提供的功能,即std::ifstreamstd::ofstream。 / p>

类似地,这里不需要动态内存分配。使用自动存储声明变量:

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);

答案 2 :(得分:2)

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

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

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