Как можно преобразовать тип массива интервала к массиву плавания? Спасибо.
#include <algorithm>
#include <iostream>
#define N 50
int main() {
int intArray[N] = { ... };
float floatArray[N];
std::copy(intArray, intArray + N, floatArray);
std::cout
<< std::boolalpha << std::equal(intArray, intArray + N, floatArray)
<< std::endl;
return 0;
}
Если у вас есть массив int
s, в основном у вас есть блок из N int
s, непрерывно хранящийся в памяти. Однако массив чисел с плавающей запятой будет состоять из N чисел с плавающей запятой, хранящихся непрерывно в памяти, то есть совершенно другой последовательности битов в памяти. Кроме того, значения с плавающей запятой представлены в двоичном формате совершенно иначе, чем целые значения. Фактически, вы даже не можете быть уверены, что int
имеет тот же размер, что и float.
Таким образом, вам нужно либо привести каждое int
к a float
отдельно, когда вы обрабатываете массив, или же создайте совершенно другой массив, скопировав исходный массив.
Например, вы можете просто лениво преобразовать каждый int в float при обработке массива:
int array[100];
// ... fill array with some values
for (int i = 0; i < 100; ++i)
{
float f = array[i]; // implicit conversion here
// now do something with this float
}
Если вы используете векторы вместо массивов, вы можете использовать итератор в конструкторе вектора для копирования.
std::vector<int> vi;
vi.push_back(1);
vi.push_back(2);
vi.push_back(3);
std::vector<float> vf(vi.begin(), vi.end());
assert(vf.size() == 3);
Если у вас есть входной массив, но вы можете иметь в качестве выхода вектор, вы также можете сделать это:
int ai[] = {1,2,3};
std::vector<float> vf(ai, ai+3);
assert(vf.size() == 3);
Если вам нужен массив в качестве входных и выходных данных, вы можете использовать std :: copy
, но просто убедитесь, что ваш выходной массив достаточно велик:
int ai[] = {1,2,3};
float af[] = {0, 0, 0};
std::copy(ai, ai+3, af);
Примечание: std :: copy
, и конструктор векторов не будет слепо копировать память, он будет неявно преобразовывать между двумя типами для каждого элемента . Он выполняет присваивания: * результат = * сначала, * (результат + 1) = * (первый + 1) и так далее ...
int ai[] = {1,2,3};
std::vector<float> vf(ai, ai+3);
assert(vf.size() == 3);
Если вам нужен как ввод, так и вывод массива, вы можете использовать std :: copy
, но просто убедитесь, что ваш выходной массив достаточно большой:
int ai[] = {1,2,3};
float af[] = {0, 0, 0};
std::copy(ai, ai+3, af);
Примечание: std :: copy
, и конструктор векторов не будет слепо копировать память, он будет неявно приводить между двумя типами для каждого элемента . Он выполняет присваивания: * результат = * сначала, * (результат + 1) = * (первый + 1) и так далее ...
int ai[] = {1,2,3};
std::vector<float> vf(ai, ai+3);
assert(vf.size() == 3);
Если вам нужен как ввод, так и вывод массива, вы можете использовать std :: copy
, но просто убедитесь, что ваш выходной массив достаточно большой:
int ai[] = {1,2,3};
float af[] = {0, 0, 0};
std::copy(ai, ai+3, af);
Примечание: std :: copy
, и конструктор векторов не будет слепо копировать память, он будет неявно преобразовывать два типа для каждого элемента . Он выполняет присваивания: * результат = * сначала, * (результат + 1) = * (первый + 1) и так далее ...
Вы не можете.
Вам придется создать другой массив и вручную скопировать элементы с помощью цикла.
В C ++ компилятор обычно не помещает циклы в результирующий двоичный файл, не имея вы явно видите это в своем коде.
IMO, Используйте преобразование и преобразуйте вектор int в вектор с плавающей запятой.
float convert (int i) { return static_cast<float>(i); }
int main () {
int first[10];
float second[10];
// set some values:
for (int i=0; i<10; i++)
first[i] = (i*10);
transform (first, first + 10, second, convert);
return 0;
}