std::span通过提供统一、安全的非拥有式视图,解决了C++中连续内存操作的碎片化与安全隐患。它封装指针与长度,支持数组、vector、指针等多种类型,避免数据复制,减少重载与越界风险,提升函数接口的简洁性与健壮性,但需注意其不拥有数据,防止悬空引用。

C++
std::span
std::vector
在我看来,
std::span
std::span
span
std::vector<int>
int[]
int*
size_t
std::span<int>
#include <iostream>
#include <vector>
#include <array>
#include <span> // C++20
void process_data(std::span<int> data) {
if (data.empty()) {
std::cout << "No data to process.\n";
return;
}
std::cout << "Processing " << data.size() << " elements: ";
for (int x : data) {
std::cout << x << " ";
}
std::cout << "\n";
// 尝试修改数据 (如果span是非const的)
if (!data.empty()) {
data[0] = 99; // span提供非const访问
}
}
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
process_data(vec); // 从vector创建span
std::cout << "Vector after processing: ";
for (int x : vec) {
std::cout << x << " ";
}
std::cout << "\n\n";
int arr[] = {10, 20, 30};
process_data(arr); // 从C风格数组创建span
std::cout << "Array after processing: ";
for (int x : arr) {
std::cout << x << " ";
}
std::cout << "\n\n";
std::array<int, 2> std_arr = {100, 200};
process_data(std_arr); // 从std::array创建span
// 从指针和长度创建span
int* raw_ptr = new int[3]{50, 60, 70};
process_data(std::span<int>(raw_ptr, 3));
delete[] raw_ptr;
// 创建子span
std::span<int> full_span = vec;
std::span<int> sub = full_span.subspan(1, 3); // 从索引1开始,取3个元素
std::cout << "\nSubspan: ";
for (int x : sub) {
std::cout << x << " ";
}
std::cout << "\n";
return 0;
}std::span
在
std::span
std::vector<int>
const std::vector<int>&
const int* data, size_t size
std::array
int* data, size_t size
size
std::span
size()
operator[]
std::span
将
std::span
std::span
std::span<T>
std::span<const T>
std::vector<T>
std::array<T, N>
span
size_t
std::span
虽然
std::span
std::span
span
std::vector
span
std::string_view
std::span
span
span
std::span
const
span
std::span<const T>
std::span
以上就是C++ span容器 连续序列视图实现的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号