Функция data C++ <array>

Класс контейнера C++ <array>


dataявляется очень особой функцией в array, онавозвращает указатель на базовый массив., позволяя использовать array так же, как C-массив.

dataЯвляется функцией-членом класса контейнера, используется, чтобывозвращать указатель на внутреннее хранилище данных контейнера. Это позволяет array взаимодействовать с API в стиле C или другим кодом, требующим сырые указатели.

dataслужит мостом между array и кодом на языке C, отражая совместимость array.

Определения слов: dataозначает "data", указывая на получение указателя на базовые данные.


Базовый синтаксис и параметры

dataявляется функцией-членом класса-контейнера, и её вызов не требует параметров.

Формат синтаксиса

T* data();
const T* data() const;

Описание параметра

  • Параметр: Нет параметров
    • dataОна не принимает никаких параметров.

Описание функции

  • Возвращаемое значение: возвращает указатель на нижележащий массив.Указатель. Если контейнер является const-контейнером, возвращается const-указатель.
  • Действие: возвращённый указатель указывает на первый элемент контейнера, что эквивалентно&operator[](0)。
  • Примечание: array имеет фиксированный размер и никогда не перераспределяет память, поэтомуdata()Возвращённый указатель всегда действителен.

Пример

Давайте досконально освоим его с помощью серии примеров.dataИспользование.

Пример 1: Базовое использование - получение указателя на нижележащий массив

Пример

#include <iostream>
#include <array>

int main() {
    // 1. Создайте массив
    std::array<int, 5> numbers = {10, 20, 30, 40, 50};

    std::cout << "Размер массива: " << numbers.size() << std::endl;

    // 2. Используйте data для получения указателя на нижележащий массив
    int* ptr = numbers.data();

    std::cout << "Доступ через указатель: " << std::endl;
    for(size_t i = 0; i < numbers.size(); ++i) {
        std::cout << "ptr[" << i << "] = " << ptr[i] << std::endl;
    }

    return 0;
}

Ожидаемый вывод:

array的大小是: 5
通过指针访问:
ptr[0] = 10
ptr[1] = 20
ptr[2] = 30
ptr[3] = 40
ptr[4] = 50

Анализ кода:

  1. numbers.data()Возвращает указатель на первый элемент.
  2. Через возвращённый указатель можно получить доступ ко всем элементам с помощью синтаксиса индексации массива.

Пример 2: Изменение элементов через указатель

dataВозвращённый указатель можно использовать для изменения элементов.

Пример

#include <iostream>
#include <array>

int main() {
    std::array<int, 3> numbers = {10, 20, 30};

    std::cout << "До изменения: ";
    for(int n : numbers) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    // Получить указатель через data() и изменить элементы
    int* ptr = numbers.data();
    ptr[0] = 100;
    ptr[1] = 200;
    ptr[2] = 300;

    std::cout << "After modification: ";
    for(int n : numbers) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    return 0;
}

Ожидаемый вывод:

修改前: 10 20 30
修改后: 100 200 300

Анализ кода:

  • Черезdata()Возвращённый указатель может напрямую изменять внутренние данные массива.

Пример 3: Взаимодействие с API в стиле C

dataодно из его основных применений — взаимодействие с C-функциями, которые требуют указатели на массивы.

Пример

#include <iostream>
#include <array>

// Гипотетическая функция в стиле C, вычисляющая сумму массива
int sumArray(const int* arr, size_t size) {
    int sum = 0;
    for(size_t i = 0; i < size; ++i) {
        sum += arr[i];
    }
    return sum;
}

int main() {
    std::array<int, 5> numbers = {1, 2, 3, 4, 5};

    // Используйте data() для передачи массива в функцию в стиле C
    int total = sumArray(numbers.data(), numbers.size());

    std::cout << "Элементы массива: ";
    for(int n : numbers) {
        std::cout << n << " ";
    }
    std::cout << std::endl;
    std::cout << "Сумма: " << total << std::endl;

    return 0;
}

Ожидаемый вывод:

数组元素: 1 2 3 4 5
总和: 15

Анализ кода:

  • numbers.data()Передайте внутренний указатель на массив в функции, которые принимаютconst int*функции.
  • Это демонстрирует способность array бесшовно взаимодействовать с кодом C.

Класс контейнера C++ <array>

Другие расширения