2015-11-03 2 views
4

const переменные не могут быть изменены после объявления. Я знаю, что я могу определить const int по:Как читать данные для построения массива const?

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

Но проблема в том, что я не знаю точно, что данные. И чтения данных только один раз достаточно, и могу ли я сохранить их в массиве const некоторыми операциями указателя? Буду признателен, если вы можете дать некоторые подсказки :)

+0

Что вы подразумеваете под незнанием данных? Вы можете использовать переменные в списке инициализаторов (внутри '{}' фигурных скобок). Если вы не знаете размер массива во время написания кода, вам следует использовать динамически распределенные массивы (которые, конечно же, не могут быть инициализированы таким образом). – matb

+1

О, ты действительно прав. Я имел в виду, что я знаю максимальный размер массива. Да, поскольку некоторые из них могут быть не инициализированы, жаль не может инициализировать переднюю часть. – younis

ответ

4

Использование функции:

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

Тогда:

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

Заменить std::vector с std::array, если вы знаете количество элементов заранее.

3

Действительно, вы не можете динамически читать данные в массив const.

Вы можете - однако - предоставить интерфейс const к изменяемым данным через ссылку на константу или указатель.

До тех пор пока вы задаете хорошие вопросы константность вы можете пойти дальше и сделать прыжок в 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 ... другие люди указывают на вероятную вероятность того, что вы не знаете, сколько их есть. В этом случае используйте вектор!)

+0

Я имею в виду, что если вы уже используете 'std :: array', вы можете просто инициализировать массив' const' непосредственно из результата вызова функции - 'std :: array <…> const variable = function();' –

+0

@KonradRudolph Но тогда вы пишете функцию, а затем вы называете функцию, а затем вы пишете документацию для этой функции, а затем продаете права Голливуду, чтобы сделать фильм. Где это заканчивается? Каждый может взять N шагов от кода и второй догадки ... Я предполагаю, что люди могут задать следующий вопрос, не знают ли они, как применять принцип на практике. – HostileFork

+0

Ничего себе, скользкий наклон закончен. Опоры, я думаю.:) (Честно говоря, это очень плохой аргумент, есть огромная польза от написания здесь небольшой функции, но это заставило меня улыбнуться.) –

2

Вы можете несколько считаны в константный массив:

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

Программа возвращает сумму чисел прочитанного.