C++ <array> data 関数

C++ 容器类 <array>C++ コンテナクラス <array>


dataarrayの中でも特に特殊な関数であり、それは基になる配列を指すポインタを返します。これにより、C配列と同じようにarrayを使用できます。

dataコンテナクラスのメンバ関数であり、コンテナ内部のデータ格納領域を指すポインタを返すために使用されます。これにより、arrayはCスタイルAPIや生のポインタを必要とする他のコードと相互運用できます。

dataarrayとC言語コードの架け橋を提供し、arrayの互換性を示しています。

単語の意味: data「データ」という意味で、基になるデータのポインタを取得することを表します。


基本構文とパラメータ

dataコンテナクラスのメンバ関数であり、呼び出す際にパラメータは必要ありません。

構文形式

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

パラメータの説明

  • パラメータ: パラメータなし
    • dataいかなるパラメータも受け付けません。

関数の説明

  • 戻り値: 基になる配列を指すポインタを返します。コンテナがconstコンテナの場合は、constポインタを返します。
  • 効果: 返されたポインタはコンテナの最初の要素を指し、次と同等です&operator[](0)。
  • 注意: arrayは固定サイズであり、メモリが再割り当てされることは決してないため、data()返されたポインタは常に有効です。

例

一連の例を通じて、dataの使い方を完全に理解しましょう。

例1:基本用法 - 基になる配列ポインタの取得

例

#include <iostream>
#include <array>

int main() {
    // 1. arrayを作成
    std::array<int, 5> numbers = {10, 20, 30, 40, 50};

    std::cout << "arrayのサイズは: " << 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 << "変更後: ";
    for(int n : numbers) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    return 0;
}

実行結果の予想:

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

コードの解説:

  • によってdata()返されたポインタはarrayの内部データを直接変更できます。

例3:CスタイルAPIとの連携

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()を使用してarrayを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()arrayの内部配列ポインタを、const int*受け取る関数に渡します。
  • これは、arrayがCコードとシームレスに連携できる能力を示しています。

C++ 容器类 <array>C++ コンテナクラス <array>

その他の拡張