【问题标题】:Populating a two dimension static vector using C++98 standard使用 C++98 标准填充二维静态向量
【发布时间】: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 的过程,但是如果没有发生更糟糕的事情并且花费更多的钱,它永远不会发生。最好是领先于曲线。

标签: c++ vector c++98


【解决方案1】:

我的 C++98 生锈了,但是这样的东西应该可以工作:

double a[] = { 1, 2 };
double b[] = { 3, 4 };
double c[] = { 5, 6 };

std::vector<double> v[] =
{
    std::vector<double>(a, a + ARRAY_SIZE(a)),
    std::vector<double>(b, b + ARRAY_SIZE(b)),
    std::vector<double>(c, c + ARRAY_SIZE(c))
};

std::vector< std::vector<double> > vv(v, v + ARRAY_SIZE(v));

【讨论】:

    【解决方案2】:

    试试这个:

    #include <iostream>
    #include <vector>
    
    /**this generates a vector of T type of initial size N, of course it is upto you whether you want to use N or not, and returns the vector*/
    template<class T>
    std::vector<T> generateInitVecs(size_t N)
    {
        std::vector<T> returnable;
    
        for(int i = 0; i < N; i++)
            returnable.push_back(0);
    
        return returnable;
    }
    
    int main()
    {
        std::vector< std::vector<double> > twoDvector;
        /**Since twoDvector stores double type vectors it will be first populated by double type vectors*/
        for(int i = 0; i < 10; i++){
            twoDvector.push_back(generateInitVecs<double>(10));
        }
    
        /**populating the vector of vectors*/
        for(int i = 0; i < 10; i++)
            for(int j = 0; j < 10; j++){
                /**can be treated as 2D array*/
                twoDvector[i][j] = 50;
            }
    
        for(int i = 0; i < 10; i++){
            for(int j = 0; j < 10; j++){
                std::cout << twoDvector[i][j] << " ";
            }
            std::cout << "\n";
        }
    }
    

    它将打印一个 10 x 10 矩阵,所有值都分配为 50。

    【讨论】:

    • 请注意,OP 明确要求static vector。我很确定他不想要有分配的循环。此外,OP 在他的问题中显示了 init.数据由不同的值组成。顺便提一句。用常量值std::vector&lt;double&gt; vec(10, 50.0); 填充std::vector 应该和std::vector&lt;double&gt; vec; vec.resize(10, 50.0); 一样有效(即使在C++98 中)。因此,我不明白为什么这里需要模板。 (我不知道为什么有人投票支持这个 - 可能是,她/他想像你一样善良。啊,对不起,欢迎来到 SO。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 2016-08-11
    • 2016-04-01
    相关资源
    最近更新 更多