Привет! Мне надоело объяснять на форумах как надо создавать одномерные и двумерные массивы. Поэтому создаю тему, на которую буду делать ссылки. От вас прошу высказать своё мнение, дополнить, посоветовать, что можно улучшить. Спасибо!
Современные одномерные и двумерные массивы на C++Одномерные и двумерные динамические массивы на C++ можно создать с помощью std::vector и отказаться от операторов new и delete
Следующий пример создаёт одномерный массив из десяти ячеек, и заполняет их нулями. В данном примере в ячейчах могут храниться только целые числа:
C++ (Qt)
#include <vector>
int main()
{
std::vector<int> arr( 10, 0 );
return 0;
}
Для того чтобы хранить вещественные числа необходимо вместо int написать float, а константу заполнения записать явно, как float: 0.0f
C++ (Qt)
#include <vector>
int main()
{
std::vector<float> arr( 10, 0.0f );
return 0;
}
Для того чтобы хранить вещественные числа двойной точности необходимо вместо int написать double, а константу заполнения записать явно, как double: 0.0
C++ (Qt)
#include <vector>
int main()
{
std::vector<double> arr( 10, 0.0 );
return 0;
}
После того как мы создали массив мы можем его использовать для хранения чисел. В следующем примере мы присваиваем нескольким элементам массива значения и выводим один их элементов массива на экран:
C++ (Qt)
#include <iostream>
#include <vector>
int main()
{
std::vector<int> arr( 10, 0);
arr[0] = 34;
arr[1] = 5;
std::cout << arr[0] << std::endl;
return 0;
}
Мы можем добавить элемент в массив, тогда увеличится его размер
C++ (Qt)
#include <iostream>
#include <vector>
int main()
{
std::vector<int> arr( 10, 0);
arr[0] = 34;
arr[1] = 5;
std::cout << "size = " << arr.size() << std::endl; // output: size = 10
arr.push_back( 87 );
std::cout << arr[10] << std::endl; // output: 87
std::cout << "size = " << arr.size() << std::endl; // output: size = 11
return 0;
}
Для того чтобы создать двумерный массив с помощью std::vector необходимо вместо int написать std::vector. Следующая запись означает, что мы создали массив из пяти элементов, каждый из которых - это массив целых чисел:
C++ (Qt)
#include <vector>
int main()
{
std::vector< std::vector<int> > arr( 5 );
return 0;
}
Но пока каждый из этих под-массивов нулевой длины. Исправим это:
C++ (Qt)
#include <vector>
int main()
{
const int nrows = 5;
const int ncols = 3;
std::vector< std::vector<int> > arr( nrows );
for( size_t row = 0; row < nrows; ++row ) {
arr[row].resize( ncols );
}
return 0;
}
Теперь у нас есть двумерный массив у которого 5 строк и 3 столбца
Присвоим какой-либо ячейке значение и выведем значение этой ячейки на экран:
C++ (Qt)
#include <iostream>
#include <vector>
int main()
{
const int nrows = 5;
const int ncols = 3;
std::vector< std::vector<int> > arr( nrows );
for( size_t row = 0; row < nrows; ++row ) {
arr[row].resize( ncols );
}
arr[4][0] = 87;
std::cout << arr[4][0] << std::endl;
return 0;
}
Передача в функциюОдномерные и двумерные массивы передаются в функцию ссылкой, чтобы передавать адрес объекта, а не копировать целиком. Если не планируется менять значения элементов массива, то добавляется const
C++ (Qt)
#include <iostream>
#include <vector>
void show1DArray( const std::vector<int> &arr1D )
{
std::cout << arr1D[0] << std::endl;
}
void show2DArray( const std::vector< std::vector<int> > &arr2D )
{
std::cout << arr2D[1][1] << std::endl;
}
int main()
{
// 1D array
std::vector<int> arr1D( 10, 0);
arr1D[0] = 34;
show1DArray( arr1D );
const int nrows = 5;
const int ncols = 3;
// 2D array
std::vector< std::vector<int> > arr2D( nrows );
for( size_t row = 0; row < nrows; ++row ) {
arr2D[row].resize( ncols );
}
arr2D[1][1] = 5;
show2DArray( arr2D );
return 0;
}
Если требуется передать одномерный массив в функцию, которая принимает указатель на буфер, то для этого есть метод .data()
C++ (Qt)
#include <iostream>
#include <vector>
void show1DArray( int *p )
{
std::cout << p[0] << std::endl;
}
int main()
{
// 1D array
std::vector<int> arr1D( 10, 0);
arr1D[0] = 34;
show1DArray( arr1D.data() );
return 0;
}