c ++类型转换数组

时间:2009-12-15 16:01:18

标签: c++ arrays casting

如何将一个int数组类型化为float数组? 感谢。

6 个答案:

答案 0 :(得分:22)

#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;
}

答案 1 :(得分:11)

如果你有一个int的数组,你基本上拥有的是一块N int在内存中连续存储的块。然而,浮点数组将是在存储器中连续存储的N个浮点数,即存储器中完全不同的位序列。另外,浮点值以完全不同于积分值的方式以二进制表示。事实上,您甚至无法确定intfloat.的大小相同

因此,您必须在处理数组时单独将每个int转换为float,否则通过复制原始数组来创建完全不同的数组。

例如,您可以在处理数组时简单地将每个int转换为浮点数:

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
}

答案 2 :(得分:4)

如果使用向量而不是数组,则可以使用向量的构造函数中的迭代器来执行复制。

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,矢量构造函数不会盲目地复制内存,它会隐式地在每个元素的两种类型之间强制转换。它执行赋值* result = * first,*(result + 1)= *(first + 1),依此类推......

答案 3 :(得分:3)

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

答案 4 :(得分:1)

你不能。

您必须创建另一个数组,并使用循环手动复制元素。

在C ++中,编译器通常不会在生成的二进制文件中放入循环,而不会在代码中明确地看到它。

答案 5 :(得分:0)

使用c ++ 17和where(或任何类似的类),可以普遍解决此问题。

std::array

人们会这样使用template <typename Y, typename X, std::size_t N, template <typename, std::size_t> typename A, std::size_t... Is> constexpr A<Y, N> elements_cast(const A<X, N> &a, std::index_sequence<Is...>) { return {std::get<Is>(a)...}; } template <typename Y, typename X, std::size_t N, template <typename, std::size_t> typename A, typename Indices = std::make_index_sequence<N>> constexpr A<Y, N> elements_cast(const A<X, N> &a) { return elements_cast<Y>(a, Indices{}); }

elements_cast