在编译时将 std::vector 转换为 std::array

问题描述 投票:0回答:1

我正在使用

std::vector
在编译时计算一些数据,并希望将结果作为数组返回,以便可以在运行时进一步使用。我在不进行两次计算的情况下设置数组大小时遇到问题。

这是我迄今为止所做的一个简化示例。代码编译并按预期工作。

constexpr auto make_vector() { 
  // complex calculation here
  return std::vector{1, 2, 3}; 
}

constexpr auto make_array() {
  const auto vec = make_vector();
  std::array<int, make_vector().size()> result{};

  std::copy(vec.cbegin(), vec.cend(), result.begin());
  return result;
}

int main() {
  constexpr auto result = make_array(); // std::array<int, 3>{1, 2, 3}
}

我理解为什么不能使用

vec.size()
来表示数组大小以及为什么
make_vector().size()
会产生编译时常量。做两次似乎不是“正确”的方法。 有没有办法避免拨打

make_vector

两次?我在这里错过了基本概念吗?

    

c++ c++20 constexpr
1个回答
0
投票

#include <algorithm> #include <array> #include <iostream> #include <vector> constexpr std::vector<int> make_vector() { std::vector<int> vec_rtrn{ 1, 2, 3 }; // complex calculation here return vec_rtrn; } constexpr auto make_array() { const auto vec = make_vector(); std::array<int, make_vector().size()> result; std::copy(vec.cbegin(), vec.cend(), result.begin()); return result; } int main() { constexpr auto result = make_array(); // std::array<int, 3>{1, 2, 3} std::for_each(result.begin(), result.end(), [](const int el) {std::cout << el << ' '; }); }

我没有进行计算,而是让向量包含值 1、2、3。
运行程序会显示数组值 1、2 和 3。

© www.soinside.com 2019 - 2024. All rights reserved.