【问题标题】:How to read data to construct a const array?如何读取数据来构造一个 const 数组?
【发布时间】:2015-11-03 08:55:07
【问题描述】:

const 变量声明后不能修改。我知道我可以通过以下方式定义const int

const int a[5]={0,1,2,3,4};

但问题是我不知道确切的数据是什么。并且只读取一次数据就足够了,我可以通过一些指针操作将它们存储在 const 数组中吗?如果您能提供一些提示,我将不胜感激:)

【问题讨论】:

  • 不知道数据是什么意思?您可以在初始化列表中使用变量(在{} 大括号内)。如果在写代码的时候不知道数组的大小,应该使用动态分配的数组(当然不能这样初始化)。
  • 哦,你说得对。我的意思是我知道数组的最大大小。是的,由于有一些可能没有初始化,所以很遗憾不能初始化前面的部分。

标签: c++ arrays pointers


【解决方案1】:

使用函数:

std::vector<int> readArray()
{
    std::vector<int> array;
    // populate array
    return array;
}

然后:

const std::vector<int> constArray = readArray();

如果您事先知道元素的数量,请将 std::vector 替换为 std::array

【讨论】:

    【解决方案2】:

    确实,您不能将数据动态读取到 const 数组中。

    但是,您可以通过 const 引用或指针为可变数据提供 const 接口

    只要您提出关于 constness 的好问题,您就可以继续前进并跳到 std::array...

    #include <array>
    #include <algorithm>
    #include <iostream>
    
    int main() {
        std::array<int, 5> writable = {4,3,0,1,2};
        const std::array<int, 5> & readable = writable;
    
        // you can mutate the writable (and use algorithms...)
        std::sort(writable.begin(), writable.end());
    
        // readable[0] = 1020; // this would give an error
    
        // but read access is fine
        for(int i : readable)
            std::cout << i << ' ';
    }
    

    (注意:正如你所说的你“不知道你的数据是什么”,有不同程度的不知道。不知道有多少,或者知道有多少但不知道价值观。我实际上处理了足够多的情况,即知道有多少而不是价值观,我不认为这种事情不会发生,buuuut ......其他人指出了你不知道的可能性知道有多少。在这种情况下,使用向量!)

    【讨论】:

    • 我的意思是,如果你已经使用了std::array,你也可以直接从函数调用结果初始化const数组——std::array&lt;…&gt; const variable = function();
    • @KonradRudolph 但是你编写函数,然后命名函数,然后编写函数文档,然后将制作电影的权利卖给好莱坞。它在哪里结束?每个人都可以从给出的代码和第二次猜测中走 N 步……我假设人们如果不知道如何将原理付诸实践,可以问下一个问题。
    • 哇,滑坡做得对。道具,我猜。 :)(老实说,这是一个非常糟糕的论点,在这里写一个小函数有很大的好处,但它让我笑了。)
    • 该死的。我当时忘了为我的答案达成电影版权交易
    【解决方案3】:

    可以读入一个常量数组:

    const auto a = []{
        std::array<int, 5> r;
        std::cout << "Enter " << r.size() << " integers: ";
        std::copy_n(std::istream_iterator<int>(std::cin), r.size(), r.begin());
    
        return r;
    }();
    

    Live On Coliru

    int main() { return std::accumulate(a.begin(), a.end(), 0u); }
    

    程序返回读取的整数之和。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-10
      • 2023-03-30
      • 2016-08-02
      • 1970-01-01
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多