std::span est une vue de mémoire continue non possédée introduite dans C 20, qui est utilisée pour accéder de manière s?re et efficace à des données continues telles que des tableaux et des vecteurs sans copie ; 1. Span peut être créé à partir de vecteurs, de tableaux, de tableaux natifs, etc.?; 2. Prend en charge les opérations telles que la taille, la sous-portée, le premier, le dernier, etc.?; 3. Il ne possède pas les données, et il faut s'assurer que le cycle de vie de la mémoire pointée est plus long que la durée elle-même ; 4. Souvent utilisé pour éviter la copie de grands tableaux et améliorer les performances?; 5. Il ne convient pas aux conteneurs non continus tels que list et deque?; lorsque vous l'utilisez, vous devez activer la norme C20 et faire attention à éviter les références pendantes.
std::span
est une vue conteneur légère et non propriétaire introduite dans C 20, utilisée pour accéder en toute sécurité à des séquences de mémoire continues (telles que des tableaux, std::array
, std::vector
, etc.) sans copier de données. C'est similaire aux combinaisons de longueur de pointeur, mais plus s?re et plus facile à utiliser.

Voici un exemple typique d'utilisation de std::span
?:
? Exemples d'utilisation de base
#include <iostream> #include <span> #include <vecteur> #include <tableau> void print_span(std::span<int> sp) { std::cout << "Taille de la portée?: " << sp.size() << '\n'; pour (int x : sp) { std :: cout << x << ' '; } std :: cout << '\n'; } int main() { // 1. Créer un span à partir de std :: vector std::vecteur<int> vec = {10, 20, 30, 40, 50}; std::span<int> vec_sp(vec); // ou vec.data(), vec.size() print_span(vec_sp); // 2. Créer un span à partir de std :: array std::array<int, 4> arr = {1, 2, 3, 4}; std::span<int, 4> arr_sp(arr); // Le deuxième paramètre du modèle est facultatif (étendue statique) print_span(arr_sp); // 3. Créer un span à partir d'un tableau natif int raw_arr[] = {100, 200, 300}?; std :: span raw_sp (raw_arr); print_span(raw_sp); // 4. Créer une sous-portée auto sub_sp = vec_sp.subspan(1, 3); // à partir de l'index 1, prenez 3 éléments std::cout << "Subspan: "; pour (int x : sub_sp) { std :: cout << x << ' '; } std :: cout << '\n'; renvoie 0?; }
Sortir:

Taille de la portée?:?5 10 20 30 40 50 Taille de la portée?:?4 1 2 3 4 Taille de la portée?:?3 100 200 300 Sous-portée?: 20 30 40
? Descriptions des fonctionnalités clés
? Tapez la signature
std::span<T> // taille dynamique std::span<T, N> // taille statique N
-
T
est le type d'élément. -
N
est la taille connue au moment de la compilation (facultatif).
?Sources de données prises en charge
-
std::vector
-
std::array
- Tableau de style C
- longueur du pointeur vers la mémoire contigu?
? Les conteneurs non continus tels que
std::list
etstd::deque
ne sont pas pris en charge.
? Opérations courantes
sp.size() // Nombre d'éléments sp.empty() sp[i] //élément d'accès (ne vérifie pas les limites) sp.at(i) // Accéder aux éléments (avec vérification des limites, pris en charge depuis C 23) sp.data() // Renvoie le pointeur d'origine sp.first(n) // La sous-étendue des n premiers éléments sp.last(n) //Les n derniers éléments sp.subspan(pos, len) //La section du milieu
? Scénario d'application pratique?: évitez de copier de grands tableaux
void process_data(std::span<const double> data) { pour (double x : données) { // Traitement en lecture seule, pas de copie std::cout << x << ' '; } std :: cout << '\n'; } int main() { std::vector<double> big_data(1000, 3.14); process_data(big_data); // Passe la vue, ne copie pas return 0; }
? Précautions
std::span
n'est pas propriétaire des données , garantissant que les données vers lesquelles elles pointent ont une durée de vie plus longue que la durée.Ne renvoie pas
span
d'un tableau local?:std::span<int> bad() { int arr[10] = {}; return std :: span (arr); // ? Pointeur pendant ! }
Le compilateur doit prendre en charge C 20?:
g -std=c 20 -o span_example span_example.cpp
C'est essentiellement ?a.
std::span
est le moyen recommandé pour gérer les vues de données continues dans le C moderne, en rempla?ant les pointeurs bruts etpair<t size_t></t>
, rendant le code plus clair et plus s?r.Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Stock Market GPT
Recherche d'investissement basée sur l'IA pour des décisions plus intelligentes

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Utilisez la fonction STD :: System () pour exécuter les commandes système, qui doivent inclure des fichiers d'en-tête et passer dans des commandes de cha?ne de style C, telles que STD :: System ("LS-L"), et la valeur de retour est -1, ce qui signifie que le processeur de commande n'est pas disponible.

L'allocateur personnalisé peut être utilisé pour contr?ler le comportement d'allocation de mémoire des conteneurs C. 1. Le journal de journalisation dans l'exemple implémente la journalisation de l'opération de mémoire en surchargeant l'allocation, la transmission, la construction et la détruire des méthodes; 2. L'allocateur doit définir des modèles Value_Type et Rebind pour répondre aux exigences de conversion du type de conteneur STL; 3. L'allocateur déclenche la sortie du journal pendant la construction et la copie, ce qui est pratique pour suivre le cycle de vie; 4. Les applications réelles incluent des pools de mémoire, de la mémoire partagée, des outils de débogage et des systèmes intégrés; 5. Depuis C 17, Construct and Destroy peut être traité par STD :: ALLOCATOR_TRAITS par défaut

Créer une structure de répertoire de projet, y compris cMakelists.txt, src / et inclure /; 2. écrivez CMakelists.txt, spécifiez la version CMake, le nom du projet, la norme C et ajouter des fichiers exécutables; 3. Utilisez mkdirbuild pour entrer dans le répertoire et exécuter cmake .. et cmake - build. pour la compilation; 4. Ajoutez plusieurs fichiers source via add_execuable et utilisez Target_include_Directories pour inclure le chemin du fichier d'en-tête; 5. Utilisez Find_package pour trouver des bibliothèques externes et lier avec Target_Link_Library; 6.

La pile de C est un adaptateur de conteneur dans STL. Il suit le principe du retour à l'abri et doit inclure des fichiers d'en-tête; Ajouter des éléments en poussant, POP supprime l'élément supérieur et accède au haut du haut de la pile. Avant l'opération, vérifiez s'il est vide, qui est souvent utilisé dans des scénarios tels que l'évaluation de l'expression et le retour de retour.

TheAutokeyWordletsThecompilerDeducevariaBeTypeSfrominitialisers, réduisant la surbosité et destiné à ma?triser.

La réponse est de définir une classe qui contient les alias et les opérations de type nécessaire. Tout d'abord, définissez la valeur_type, référence, pointeur, différence_type et iterator_category, puis implémentez les opérations de déréférence, d'incrément et de comparaison. Enfin, fournissez des méthodes begin () et end () dans le conteneur pour renvoyer l'instance itérateur, ce qui le rend compatible avec les algorithmes STL et la plage pour les boucles.

AstaticvariableInc conserve la valeur de l'entreprise entre la fonctionnalités et les étatsinitializedEnce.2

Utilisez Std :: ifstream et STD :: ISTREAMBUF_ITERATOR pour lire efficacement le contenu entier du fichier vers les cha?nes, y compris les espaces et les pauses de ligne, et convient aux fichiers texte de taille moyenne.
