std::size în C++

Iteratori C++17

std::size dă numărul de elemente al unui container sau tablou C; std::empty spune dacă nu are elemente.

Sintaxă
#include <iterator>

constexpr auto size(const C& container) -> decltype(container.size());
constexpr std::size_t size(const T (&tablou)[N]) noexcept;
constexpr bool empty(const C& container);

Ce face std::size

std::size(x) returnează x.size() pentru containere și N pentru un tablou C de N elemente. Înlocuiește vechiul truc sizeof(t) / sizeof(t[0]), care dă rezultate greșite (fără nicio eroare) dacă t este de fapt un pointer.

std::empty(x) returnează x.empty() pentru containere și false pentru tablouri C (care nu pot avea 0 elemente). Din C++20, std::ssize(x) dă dimensiunea ca număr cu semn, util când o compari cu un int.

Parametri

Parametru Descriere
container / tablou Un container standard, un tablou C sau un std::initializer_list.

Ce returnează

std::size: numărul de elemente. std::empty: bool.

Exemple

Exemplul 1: Dimensiunea oricărei colecții

#include <iterator>
#include <map>
#include <print>
#include <string>
#include <vector>

int main() {
    const char* luni[] = {"ianuarie", "februarie", "martie"};
    std::vector<int> note{9, 8};
    std::map<std::string, int> gol;

    std::println("luni: {}, note: {}, gol: {}", std::size(luni), std::size(note), std::size(gol));
    std::println("note goale? {}  map gol? {}", std::empty(note), std::empty(gol));

    for (int i = 0; i < std::ssize(luni); ++i) {     // ssize: int cu int, fără avertismente
        std::println("{}. {}", i + 1, luni[i]);
    }
}

Rezultat

luni: 3, note: 2, gol: 0
note goale? false  map gol? true
1. ianuarie
2. februarie
3. martie

Greșeli frecvente

  • Folosești sizeof(t) / sizeof(t[0]) pe un parametru de funcție int t[]: obții dimensiunea unui pointer împărțită la cea a unui int (de obicei 2), nu numărul de elemente. std::size refuză să compileze în acest caz, ceea ce e mai sigur.

Comenzi înrudite

  • std::vector::size: size() spune câte elemente are vectorul; empty() spune dacă nu are niciunul.
  • std::begin: Funcții libere care dau iteratorul de început și de sfârșit pentru orice container, inclusiv pentru tablourile C.
  • std::array: Tablou cu dimensiune fixă, cunoscută la compilare, cu interfața unui container (size, at, begin, end).