章の索引
ベクトルとは?
vector
これは、ランダム アクセスをサポートする C++ STL の動的配列クラス ライブラリです。Java に似ていますArrayList
。
ベクターライブラリーの導入方法は?
#include<vector>
using namespace std;
ベクターを作成するには?
Java の ArrayList と同様に、ジェネリックを使用して、特定の型のデータを格納できるベクターを作成します。
vector<int> nums;
上記のコードのように、int
タイプのベクトルを作成します。
一般的な方法
vector [ 1 ]の一般的なメンバ メソッドを次に示します。
要素を挿入
// 向末尾添加一个元素
void push_back(const T& x)
要素を削除
// 删除末尾的元素
void pop_back()
// 清空所有元素
void clear()
アクセス要素
// 返回pos位置元素的引用
reference at(int pos)
// 返回首元素的引用
reference front()
// 返回尾元素的引用
reference back()
// 数组式的访问方式
nums[index]
要素を修正する
// 设置第n个元素的值为x
void assign(int n,const T& x)
// 数组式的修改方式
nums[index] = newValue;
サイズを探す
unsigned int size() const
ここでの戻り値の型は符号なし整数であることに注意してくださいunsigned int
。
空
// 判断是否为空
bool empty() const
// 通过当前大小
if (nums.size() == 0)
二次元配列
vector<vector<int>> nums;
分類する
ベクトルを並べ替えるには、algorithm
ライブラリをインポートしてそのsort
メソッドを呼び出す必要があります。
// 默认升序排序
sort(nums.begin(), nums.end());
// 降序排序方法
sort(nums.begin(), nums.end(), greater<int>());
// 另一种升序排序方法
sort(nums.begin(), nums.end(), less<int>());
sort
の 3 つのパラメーターのオーバーロードは、 Java のComparator
コンパレーターと同様に、比較メソッドに渡すことができます。インポートライブラリは、それぞれ降順と昇順を表すと をfunctional
使用できます。山括弧内のジェネリック型は正しく記述する必要があることに注意してください。greater
less
カスタムソート
昇順と降順以外の比較ロジックが必要な場合があるため、カスタム コンパレータ[ 2 ]が必要です。
より複雑な構造
struct s
{
int a, b;
};
カスタムコンパレータ
true
戻り値のある条件は、s1
前のs2
条件を表すことに注意してください。
bool comparator(const s &s1, const s &s2)
{
return s1.a > s2.a;
}
カスタム コンパレータを使用した並べ替え
s
構造体を格納するためにベクトルを再定義する
vector<s> sVector;
分類する
sort(sVector.begin(), sVector.end(), comparator);
実際に遭遇したピット
ベクトルが空の場合、通常の判定
if (0 < nums.size() - 1)
期待される結果は false ですが、実際の実行結果は true です。
デバッグ後、予期しない結果が得られたことがわかりnums.size() - 1
、出力はそれが であることを示してい4294967295
ます2^32-1
。
その理由は、size
ベクトル メソッドの戻り値の型が符号なし整数であり、実際には演算であるからです0 + (-1)
. 負の数は補数コードに格納されるため、-1
ベクトルの 2 進数表現は11111111 11111111 11111111 11111111
0 と合計しても 32 個の 1 のままであり、 10 進数に変換されているのは4294967295
[ 3 ]です。
解決
計算結果を符号付き整数に強制します[ 4 ]。
if (0 < (int)(nums.size() - 1))