【发布时间】:2018-09-04 22:58:58
【问题描述】:
我有一个需要填充的二维静态向量 (std::vector< std::vector<double> >),我正在处理一个需要使用 C++98 编译的旧项目。因此,我不允许使用std::vector<...> v = { {1,2}, {3,4} }; 语法。
对于一维向量,将数组分配为double a[] = {1,2};,然后使用std::vector<double> v(a, a+2) 就可以了;但是,它不适用于二维向量。
std::vector< std::vector<double> >
x1_step_lw_2(__x1_step_lw_2,
__x1_step_lw_2 + ARRAY_SIZE(__x1_step_lw_2));
我收到以下错误:
../src/energyConsumption/ue-eennlite-model-param-7IN-30NN.cpp:193:33: required from here
/usr/include/c++/4.8/bits/stl_construct.h:83:7: error: invalid conversion from ‘const double*’ to ‘std::vector<double>::size_type {aka long \
unsigned int}’ [-fpermissive]
::new(static_cast<void*>(__p)) _T1(__value);
(ARRAY_SIZE(x) 是一个计算数组大小的宏)
因为这些向量是类的属性,所以在构造函数上初始化它们是没有意义的。
我与这个问题斗争了一段时间,大多数“解决方案”都涉及切换到 C++11,这不是一个选项。
感谢任何帮助。
【问题讨论】:
-
它必须是
vector的vectors吗?您可以围绕一维vector创建一个包装器类,它执行一维 二维映射并呈现二维的外观。然后,您可以在初始化时提取一维技巧,并在使用数据时获得更好的空间局部性的性能优势。 -
您或许应该游说(即说服您的经理或客户)将旧代码移植到 C++11 或更新版本,因为 C++98 在 2018 年真的很古老(我想即使是熟练的程序员在 C++98 上变得越来越难)。是的,旧的未维护代码变得腐烂了。而且移植到 C++11 需要花钱。 Technical debt 确实要花钱
-
在过去的几周里,我非常享受将一些从 90 年代的旧代码更新到 C++14 的过程,但是如果没有发生更糟糕的事情并且花费更多的钱,它永远不会发生。最好是领先于曲线。