【C++】vectorの最後の要素にアクセス・更新する方法
この記事では、C++のvectorコンテナにおける「最後の要素」へのアクセス方法と更新方法について、具体例を挙げながらわかりやすく解説します。
vectorテンプレートとは?
vectorは、サイズが動的に変化するシーケンスコンテナです。コンテナとは、同じ型のデータをまとめて格納するためのオブジェクトであり、シーケンスコンテナは要素を厳密な線形順序で保持します。
vectorコンテナは要素を連続したメモリ領域に格納するため、添字演算子 [] を使って任意の要素に直接アクセスできます。また、通常の配列と異なりサイズが動的に変化し、ストレージの管理は自動的に行われるのが特徴です。
vectorの定義
template <class T, class Alloc = allocator<T>> class vector;
vectorのテンプレートパラメータ
vectorクラステンプレートは、次の2つのパラメータを受け取ります。
T:コンテナに格納される要素の型
Alloc:アロケータオブジェクトの型(デフォルトは allocator<T>)
vectorの最後の要素にアクセスする方法
vectorの末尾の要素を取得・更新するには、大きく分けて以下の2つの方法があります。
方法1:back()関数を使用する
back()関数は、vectorの最後の要素への参照を返します。戻り値が参照であるため、そのまま代入することで要素を直接更新できるのがポイントです。
#include <bits/stdc++.h>
using namespace std;
int main(){
vector<int> vec = {11, 22, 33, 44, 55};
cout << "更新前のvectorの要素: ";
for(auto i = vec.begin(); i != vec.end(); ++i){
cout << *i << " ";
}
// back() を呼び出して最後の要素を取得
cout << "\nvectorの最後の要素: " << vec.back();
// back() を使って最後の要素を更新
vec.back() = 66;
cout << "\n更新後のvectorの要素: ";
for(auto i = vec.begin(); i != vec.end(); ++i){
cout << *i << " ";
}
return 0;
}
実行結果
上記のコードを実行すると、次のような出力が得られます。
更新前のvectorの要素: 11 22 33 44 55 vectorの最後の要素: 55 更新後のvectorの要素: 11 22 33 44 66
方法2:size()関数を使用する
size()関数で要素数を取得し、「要素数 − 1」をインデックスとして添字演算子 [] 経由でアクセスする方法です。
#include <bits/stdc++.h>
using namespace std;
int main(){
vector<int> vec = {11, 22, 33, 44, 55};
cout << "更新前のvectorの要素: ";
for(auto i = vec.begin(); i != vec.end(); ++i){
cout << *i << " ";
}
// size() を使って最後の要素を取得
int last = vec.size();
cout << "\nvectorの最後の要素: " << vec[last - 1];
// 添字演算子で最後の要素を更新
vec[last - 1] = 66;
cout << "\n更新後のvectorの要素: ";
for(auto i = vec.begin(); i != vec.end(); ++i){
cout << *i << " ";
}
return 0;
}
実行結果
上記のコードを実行すると、次のような出力が得られます。
更新前のvectorの要素: 11 22 33 44 55 vectorの最後の要素: 55 更新後のvectorの要素: 11 22 33 44 66
注意点
空のvectorに対してback()を呼び出したり、範囲外のインデックスにアクセスしたりすると、未定義動作となるため注意が必要です。要素にアクセスする前に、empty()関数などでvectorが空でないことを確認しておきましょう。
また、back()は末尾要素への参照を直接返すため、size()を使う方法よりもコードが簡潔になり、意図も明確になります。単純に末尾の要素を扱いたい場合は、back()の使用を推奨します。
-
C++ STLのvector::begin()とvector::end()の使い方を徹底解説
C++のSTL(標準テンプレートライブラリ)におけるvector::begin()およびvector::end()は、ベクター内の要素を走査するために欠かせないメンバ関数です。本記事では、それぞれの役割と実際のコード例を通じて、その使い方をわかりやすく解説します。 vector::begin() とは vector::begin()は、コンテナ(ベクター)の先頭要素を指すイテレータを返す双方向イテレータ用の関数です。この戻り値を使うことで、ベクターの最初の要素から順番にアクセスすることができます。 vector::end() とは vector::end()は、コンテナの末尾(最後の要素の次の
-
C++でvector(ベクトル)を並べ替える方法:std::sort()の使い方
C++でvector(可変長配列)を並べ替えるには、標準ライブラリの std::sort() 関数を使用します。この関数は <algorithm> ヘッダーで定義されており、デフォルトでは要素を昇順(小さい順)に並べ替えます。 また、安定ソートを行いたい場合は std::stable_sort を使用します。これは sort() と同じように動作しますが、値が等しい要素同士の相対的な順序を保持する点が異なります。さらに、要件に応じてクイックソートやマージソートなどのアルゴリズムを自前で実装して利用することも可能です。なお、std::sort() の平均計算量は O(N log N