массив преобразования типа C++

Как можно преобразовать тип массива интервала к массиву плавания? Спасибо.

9
задан Karl Glaser 15 December 2009 в 16:01
поделиться

5 ответов

#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;
}
22
ответ дан 4 December 2019 в 06:16
поделиться

Если у вас есть массив 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
}
11
ответ дан 4 December 2019 в 06:16
поделиться

Если вы используете векторы вместо массивов, вы можете использовать итератор в конструкторе вектора для копирования.

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) и так далее ...

4
ответ дан 4 December 2019 в 06:16
поделиться

Вы не можете.

Вам придется создать другой массив и вручную скопировать элементы с помощью цикла.

В C ++ компилятор обычно не помещает циклы в результирующий двоичный файл, не имея вы явно видите это в своем коде.

1
ответ дан 4 December 2019 в 06:16
поделиться

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;
}
3
ответ дан 4 December 2019 в 06:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: