C++ <array> data 関数
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;
}
#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
コードの解説:
numbers.data()最初の要素を指すポインタを返します。- 返されたポインタを使用すると、配列の添字構文で全ての要素にアクセスできます。
例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;
}
#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;
}
#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>