Векторный массив C / WhileLoop

#c #arrays #vector

#c #массивы #векторный

Вопрос:

Я читаю C Programming In Easy Steps 4th и прочитал кое-что, что мне трудно понять. Я только начал читать его на днях.

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

 #include <iostream>
#include <vector>       // Include vector support (Vector function library)
using namespace std;

int main()
{


    //Declaring an integer vector and an integer variable for loop counter
    vector <int> vec ( 10 );
    int i = 0;


    //Now inserting a while loop to assign a counter value to an element of the vector on each iteration
    while ( i < vec.size() )
    {
        i  ;                 //Increment the counter
        vec[ i -1 ] = i;     // Assign count to element

        cout << " | " << vec.at ( i -1 );
    }


    return 0;
}
  

Я все понимаю, но эта строка:

         vec[ i -1 ] = i;     // Assign count to element
  

Я не уверен, что именно это делает, особенно в части i -1? Может ли кто-нибудь разбить это для меня простым для понимания способом? Я собираюсь быстро повторно посетить раздел о векторных массивах и посмотреть, смогу ли я получить понимание.

Комментарии:

1. Доступ к массивам и векторам можно получить с помощью подписки индексами. i-1 является индексом.

2. Думаю, теперь я это понимаю. Идет обратный отсчет: vector <int> vec ( 10); От 10 до нуля? и присваивание значений каждому элементу? Кто-нибудь может подтвердить

3. 10 — это размер вектора. i начинается с 0 и i используется в выражении индекса. i увеличивается при каждом выполнении тела цикла. Таким образом, он подсчитывается.

Ответ №1:

Векторные обозначения начинаются с 0 . Вектор из 10 элементов индексируется от 0 до 9 . Предполагая, что ваша цель — последовательно загружать массив с числами 1 в 10 , и поскольку вы начинаете с i 0 и увеличиваете его перед использованием в индексном выражении, вам нужно вычесть 1 из него, чтобы получить правильный индекс.

Этот фрагмент кода делает то же самое.

 vector<int> vec(10);

int i = 0;
while (i < vec.size())
{
    vec[i] = i   1;
    i  ;
}

i = 0;
while (i < vec.size())
{
    cout << i << ": " << vec.at(i) << endl;
    i  ;
}
  

Ответ №2:

Вам может помочь, если вы разбите код на то, что на самом деле выполняет цикл while, с помощью отдельных операторов (вы бы увидели подобное, если бы выполняли цикл while с помощью отладчика, а также добавляли операторы watch, такие как i-1):

 #include <iostream>
#include <vector>       // Include vector support (Vector function library)
using namespace std;

int main()
{


    //Declaring an integer vector and an integer variable for loop counter
    vector <int> vec ( 10 ); // vector of 10 elements: 0...9
    int i = 0; // i starts with the value of 0

    // replace while loop with the individual statements the loop accomplishes
    // note also that vec.size() = 10
    // while (i < vec.size())

    // increment i to 1 (started as 0, from above)
    i  ;                 //Increment the counter
    vec[ 0 ] = i;     // i - 1 = 0 here - Assign count to element
    cout << " | " << vec.at ( 0 );
    // increment i to 2
    i  ;                 //Increment the counter
    vec[ 1 ] = i;     // i - 1 = 1 here - Assign count to element
    cout << " | " << vec.at ( 1 );

    // continue to i = 9 ...

    // increment i to 10
    i  ;                 //Increment the counter
    vec[ 9 ] = i;     // i - 1 = 9 here - Assign count to element
    cout << " | " << vec.at ( 9 );    
    return 0;
}
  

Ответ №3:

вы присваиваете своему вектору числа от 1 до 1o.

 vec[i-1] = i
  

следует непосредственно после i что означает, что для вашего первого индекса вы присваиваете значение на количество / шаг больше, чем index .
Проще говоря, давайте проследим за первыми 4 значениями i и элементами, вставленными в вектор:

 i = 0;
i = 1;here vec[ 1 - 1] = vec[0] = 1
i = 2;here vec [2 - 1] = vec[1] = 2
i = 3;and finally vec[ 2 ] = 3
  

Ответ №4:

Векторы — это классы-оболочки для массивов (источник: Ссылка на C reference ), которые также выполняют некоторые действительно интересные вещи, такие как использование шаблонов для распределителей, предоставление динамического пространства и использование итераторов stl.

Таким образом, к векторам можно обращаться как к массивам с помощью оператора [ ]. Два фрагмента кода идентичны:

Во-первых, форма массива:

 //Allocate and assign array

int* arr[5]={1,2,3,4,5};

//Print the 3rd element, note that the first index corresponds to 0.

std::cout<< arr[2] <<std::endl;

//Reassign the 2nd element:

arr[1]=54;
  

Теперь векторная версия:

 //Allocate and assign vector

std::vector<int> arr( {1,2,3,4,5} );

//Print the 3rd element, note that the first index corresponds to 0.

std::cout<< arr[2] <<std::endl;

//Reassign the 2nd element:

arr[1]=54;
  

Совет для мудрых: доступ к подобным векторам может быть опасным, поскольку размер массива может быть изменен в другом месте кода. Вместо этого рассмотрите следующее для назначения:

 std::vector<int> arr( {1,2,3,4,5} );
int index=0;
for(std::vector<int>::iterator it = arr.begin(); it!= arr.end();   it){
    if(index   == 3){
        (*it) = 54;
    }
}