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