Проблемы с для цикла C ++ - PullRequest
       2

Проблемы с для цикла C ++

0 голосов
/ 15 сентября 2018

Раньше я кодировал в javascript, но моя новая школа заставляла меня изучать c ++. Я немного новичок в этом языке, и вот проблема:

В JavaScript я могу написать такой код:

for(let i = 0; i < 10; i++){
    var variable[i] = i+3;
}

for(let j = 0; j < 10; j++){
    console.log(variable[j]);
}

Вы можете сказать: «Почему бы вам просто не написать код в 1 для цикла», но это только пример.

А сейчас я пытаюсь переписать приведенный выше код в cpp:

int n,k,w;
cin>>n>>k;

for(int i = 0; i < n; i++){
    int w[i];
    cin>>w[i];
}

//some code here

for(int i = 0; i < n; i++){
    cout<<w[i];
}

А вот и вопрос. Как я могу cout все переменные w с индексом i, потому что я получаю ошибку [Ошибка] недопустимые типы 'int [int]' для индекса массива.

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Не все компиляторы поддерживают VLA, поэтому придерживайтесь стандартов;всегда указывайте постоянный размер для массивов.Если вам нужен динамически изменяемый размер, подумайте о том, чтобы использовать контейнеры другого типа, такие как: std :: vector.

Также, почему вы повторно объявили int w внутри цикла for?Он является локальным для цикла for, и изменения в нем не будут влиять на внешний цикл.

Вы получаете ошибку времени компиляции во втором цикле, которая сообщает, что w не является массивом.Чтобы решить эту проблему, сделайте int w[] внешний и верхний из двух циклов.

int n, k;
cin >> n >> k;
int w[n];

for(int i = 0; i < n; i++)
    cin >> w[i];

//some code here

for(int i = 0; i < n; i++)
    cout << w[i];

В качестве альтернативы VAL используйте std :: vector:

std::vector<int> w;
int n, k;
std::cin >> n;

for(int i(0); i!= n; ++i){
    std::cin >> k;
    w.push_back(k);
}


for(auto i(0); i != w.length(); ++i)
    std::cout << w[i] << ", ";
0 голосов
/ 15 сентября 2018

Что вам, вероятно, нужно:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec;
    int size = 0;

    std::cin >> size;

    for(int i = 0; i < size; i++){
        int number = 0;
        std::cin >> number;
        vec.push_back(number);
    }

    for(int i : vec){
        std::cout << i << " ";
    }
}

std::vector<int> - это класс, разработанный для предоставления интерфейса к массиву с изменяемыми размерами.Функция push_back() добавляет вектор с заданным аргументом.

Последний цикл, который называется на основе ранжирования for(), используется для печати всех элементов вектора.Вы можете заменить его простым старым циклом for() с индексированием, поскольку std::vector поддерживает operator [], но если подход на основе диапазона достаточен, его следует предпочесть.

РЕДАКТИРОВАТЬ: я не знаюJavaScript, но я предполагаю (из вашего примера), что переменные, объявленные внутри циклов , видны везде.Это не так в C++.Видимость переменных зависит от области, в которой они объявлены. Если вы хотите, чтобы ваш список / массив / вектор / любой другой контейнер был виден этим двум for() циклам, вы должны объявить его outside them - как в моем примере выше.

EDIT2: Хотя вы почти всегда должны использовать std::vector для таких задач, можно утверждать, что они хотят отключить изменение размера контейнера.В этом случае нам остается простое динамическое распределение.Мы обращаемся к библиотеке <memory>, поскольку нам не нужно управлять ею самим:

#include <iostream>
#include <memory>

int main() {
    int size = 0;
    std::cin >> size;

    auto arr = std::make_unique<int[]>(size);

    for(int i = 0; i < size; i++){
        int number = 0;
        std::cin >> number;
        arr[i] = number;
    }

    for(int i = 0; i < size; i++){
        std::cout << arr[i] << " ";
    }
}

Для auto, либо прочитайте здесь , либо представьте, что это просто магический тип, который( почти всегда ) правильно.Это похоже на var в Python или JavaScript (но позже его тип не может быть изменен).

Для std::unique_ptr<T[]>, либо прочитайте здесь , либо представьте, что это просто динамически распределенный массив, которыйавтоматически delete[] s сам.Если вы еще не узнали о динамическом распределении, просто проигнорируйте, что это значит, и подождите, пока оно не будет введено.

Обратите внимание, что мы также избавились от цикла for() на основе диапазона *1048*.К сожалению, он не работает с простыми динамически размещаемыми массивами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...