tg-me.com/cpp_geek/288
Last Update:
⚡ std::span
— мощная альтернатива std::vector
и std::array
Сегодня поговорим о std::span
— контейнере, который делает работу с массивами и векторами в C++ более удобной и эффективной. 🚀
❌ Проблема: Лишние копии данных
Представьте, что у нас есть функция, принимающая массив чисел:
void processArray(const std::vector<int>& arr) {
for (int num : arr) {
std::cout << num << " ";
}
std::cout << std::endl;
}
С одной стороны, передача
const std::vector<int>&
предотвращает копирование, но что, если у нас массив std::array
или сырой int[]
? Придётся перегружать функцию или копировать данные в
std::vector
. ✅ Решение: Используем
std::span
std::span
позволяет передавать любой диапазон (`std::vector`, std::array
, сырые массивы) без копирования:
#include <iostream>
#include <span>
#include <vector>
#include <array>
void processArray(std::span<int> arr) {
for (int num : arr) {
std::cout << num << " ";
}
std::cout << std::endl;
}
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::array<int, 5> arr = {6, 7, 8, 9, 10};
int rawArr[] = {11, 12, 13, 14, 15};
processArray(vec); // ✅ Работает
processArray(arr); // ✅ Работает
processArray(rawArr); // ✅ Работает
}
🚀 Преимущества
std::span
✅ Не копирует данные — передаётся как ссылка
✅ Работает с любыми последовательностями
✅ Гибкость — можно создавать срезы без копий
Пример использования
.subspan()
, чтобы передавать часть массива:
std::vector<int> vec = {1, 2, 3, 4, 5};
std::span<int> sp = vec;
processArray(sp.subspan(2)); // Выведет: 3 4 5
⚠️ Важно
-
std::span
не владеет данными. Убедитесь, что исходные данные живут дольше span
. - Не поддерживает автоматическое изменение размера, как
std::vector
. 📌 Итог
Если ваша функция принимает
std::vector<int>&
, std::array<int, N>&
, int[]
или даже std::initializer_list<int>
, замените их на std::span<int>
! Это сделает код более гибким и эффективным. 🔥 ➡️ @cpp_geek
BY C++ geek
Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283
Share with your friend now:
tg-me.com/cpp_geek/288