Open7
vector
ピン留めされたアイテム
vectorの初期化,代入,取得,削除
初期化
vector<int> v;
vector<int> data(123); // 要素数123
vector<int> data(10, 5); // 要素数10、全ての要素の値5 で初期化
vector<vector<int>> arr(5, vector<int>(5)); // 5×5の二次元配列
※stringの時は,二次元配列にしなくても一次元配列で(arr[i][j]に)アクセス可!
挿入
- 途中に挿入
vector<int> arr(n);
p=arr.begin();
p++;
arr.insert(p, 2); // arrの[1]に2を挿入
- 最後に挿入
vector<int> ans;
for(auto i : vec) if(c[i] == cmin) ans.push_back(i);
取得
- 最大・最小値を取得
*max_element(v.begin(), v.end());
*min_element(v.begin(), v.end());
auto iter = max_element(v.begin(), v.end);
cout<<*iter<<endl;
- 要素数
int length=v.size();
- 計算
accumulate(v.begin(), v.end(), 0); // 総和を計算
- ソート
sort(v.begin(), v.end()); // 昇順ソート
sort(v.rbegin(), v.rend()); // 降順ソート
- 最初,最後
v.first()
v.back()
削除
- 最後の要素を削除
v.pop_back();
- 要素番号で削除
v.erase(v.begin() + 1); // 要素番号を指定して削除
v.erase(v.begin(), v.begin() + 2); // 連続要素を削除, ex)[0, 1, 2, 3]->[2, 3]
- 値が一致する要素を削除
ex)2を全て削除
※removeは削除しない要素の配列の次を返す(?)からそこから配列の最後をeraseで削除する!
v.erase(remove(v.begin(), v.end(), 2), v.end());
多次元配列を動的に作成!
aを一次元配列から2次元配列へ動的に作成する!
int n, x, c[101];
vector<int> a[101]; // まず一次元配列作成
cin >> n; // nを取得
for(int i = 1; i <= n; i++){
cin >> c[i]; // cを取得
a[i].resize(c[i]); // cの数だけa[i]のサイズを拡張,これによって多次元配列に!
for(int j = 0; j < c[i]; j++) cin >> a[i][j]; // 多次元配列に格納していく
}
配列
- 配列のサイズ
- 空かどうか
v.size() // 配列のサイズ
v.empty() // 配列が空か
最大公約数と最小公倍数
gcd
gcd(100, 150); // 100,150の最大公約数を返す
int gcd(int a, int b) {
if (b==0) return a;
return gcd(b, a%b);
}
lcm
int lcm(int a, int b) {
return (a * b) / gcd(a, b);
}
異なる型を挿入
今回はintとintの配列を持った型を定義!
ex)
10000 2 1 3
2->後ろに2つの整数が続くという意味
int N, M;
cin >> N >> M;
vector<pair<int, vector<int>>> products(N);
for (auto &&[price, feature] : products) {
cin >> price;
int K;
cin >> K;
feature = vector<int>(K);
for (auto &&f : feature)
cin >> f;
}
文字列
str.length();
str.size();
intでキャストの必要あり?
int
- int の桁数
int num = 10000;
string temp = to_string(num);
temp.length();
累乗
int num = pow(x, 2); // xの2乗