
Я просматривал интересную лекцию Андреаса Фертига на YouTube на основе C++ Templates. В одном из разделов он упомянул std::span, и мне было очень интересно понять/узнать об этом больше.
cppreference описывает span как объект, который может принимать непрерывную последовательность объектов в памяти с первым элементом последовательности, равным 0. Другими словами, span — это представление, не являющееся владельцем непрерывной последовательности объектов, таких как массивы в стиле C, std::array, а также std::vector. Эта концепция очень похожа на концепцию std::string_view, которая дает представление о переменных типа std::string и const char*. Это также повышает производительность кода.
std::span заставил меня задуматься о том, как его можно использовать в рабочем коде. Что касается меня, я использовал string_view, когда мне нужна была совместимость между кодом Legacy в стиле C и кодом Modern C++ 17 Standard. Ниже я привожу несколько примеров, которые помогут вам лучше понять изложенную выше концепцию.
Пример std::span:
#include <iostream>
#include <array>
#include <vector>
#include <span>
using namespace std;
void printMe(std::span<int> container)
{
for(auto& e : container)
{
cout<< e <<" ";
}
cout << "\n\n";
}
int main()
{
int arr[]{1,2,3,4};
printMe(arr);
std::vector<int> vec{1,2,3,4,5,6};
printMe(vec);
std::array<int, 4> arr2{1,2,9,10};
printMe(arr2);
return 0;
}
Приведенный выше код будет скомпилирован только компилятором, поддерживающим стандарт C++20. Вы можете использовать обозреватель компиляторов для проверки этого кода. Не забудьте использовать версию gcc выше 10 с параметрами компиляции как -std=c++2a.
Вывод:
1 2 3 4 1 2 3 4 5 6 1 2 9 10
Итак, вы можете видеть, как независимо от типа контейнера, массива или вектора можно использовать диапазон для получения представления о нем.
Далее приведен пример std::string_view:
#include <iostream>
using namespace std;
void printMe(std::string_view str)
{
cout << str << "\n";
}
int main()
{
const char* s = "It is a great day!";
printMe(s);
std::string ss = "I wish you a beautiful day!";
printMe(ss);
return 0;
}
Вывод:
It is a great day! I wish you a beautiful day!
Это будет скомпилировано GCC версии › 7.3 с флагом -std=c++17. Если вы хотите узнать больше о std::string_view, перейдите на эту страницу.
Я надеюсь, что в наш языковой стандарт будут включены такие хорошие концепции, которые сделают его надежным, повысят производительность и упростят написанный код.
СЧАСТЛИВОГО ПРОГРАММИРОВАНИЯ С++!!!