vector向量(dynamic arrays)
vector<int> v;v.push_back(3); // [3]v.push_back(2); // [3,2]v.push_back(5); // [3,2,5]cout << v[0] << "\n"; // 3cout << v[1] << "\n"; // 2cout << v[2] << "\n"; // 5for (int i = 0; i < (int)v.size(); i++) { cout << v[i] << "\n";}vector<int> v;v.push_back(5);v.push_back(2);cout << v.back() << "\n"; // 2v.pop_back();cout << v.back() << "\n"; // 5// size 10, initial value 0vector<int> v(10);// size 10, initial value 5vector<int> v(10, 5);// vector的排序sort(v.begin(), v.end());reverse(v.begin(), v.end());sort(v.rbegin(), v.rend());// int a[N]的排序sort(a, a+n);reverse(a, a+n);// 倒序,这个要注意一下OJ是否支持sort(a, a + n, greater<int>());
// 【要点】(int)A.size()// vector中size函数的返回值是一个无符号类型// 当size是0的时候,对其进行减1,会造成数字的越界溢出#include <bits/stdc++.h>using namespace std;vector<int> A;int main(){ cout << A.size() << ' ' << A.size() - 1 << '\n'; return 0;}// 输出 0 18446744073709551615#include <bits/stdc++.h>using namespace std;vector<int> A;int main(){ cout << A.size() << ' ' << (int)A.size() - 1 << '\n'; return 0;}// 输出 0 -1//【注意】for(int i = 0; i < (int)A.size(); i++){} 要写一个强制取整
// 去重#include <bits/stdc++.h>using namespace std; vector<int> A;int n;void print(){ for (auto x : A) printf("%d ", x); puts("");}int main(){ cin >> n; for (int i = 0; i < n; i++){ int x; cin >> x; A.push_back(x); // 3 2 1 2 1 } sort(A.begin(), A.end()); print(); // 1 1 2 2 3 vector<int>::iterator it = unique(A.begin(), A.end()); print(); // 1 2 3 2 3 A.erase(it, A.end()); // 1 2 3 print(); return 0;}
// 重点代码 vector<int> A;sort(A.begin(), A.end());A.erase(unique(A.begin(), A.end()), A.end()); // 这样就可以得到一个去重后的vector
// resizing vector#include <iostream>#include <vector>int main (){ std::vector<int> myvector; // set some initial content: for (int i=1;i<10;i++) myvector.push_back(i); myvector.resize(5); myvector.resize(8,100); myvector.resize(12); std::cout << "myvector contains:"; for (int i=0;i<myvector.size();i++) std::cout << ' ' << myvector[i]; std::cout << '\n'; return 0;}// myvector contains: 1 2 3 4 5 100 100 100 0 0 0 0
为什么c++中vector的size()造成了死循环?
#include<bits/stdc++.h>using namespace std;int main(){ vector<int> book(800); //造成死循环 for(int i=0;i<book.size()-900;i++){ cout<<"hello"<<endl; } //不会造成死循环 for(int i=0;i<(int)book.size()-900;i++){ cout<<"hello"<<endl; } }
book.size()是无符号整形,无符号整形减去有符号整数,且差值为负,这样就导致溢出。所以你看到的是死循环。但是溢出也是有个值的,一直运行下去,也会结束,只是这个值很大。你直接把book.size()写成(int)book.size() ,运行结果必定不会进去循环语句,得出的差值是-100.已经被转换成整数了
// 关于.size()函数的返回值,是一个unsigned int// 还有一个案例// http://ybt.ssoier.cn:8088/problem_show.php?pid=1143// 1143:最长最短单词// 在这个代码中if (temp.size() > maxn), 这个不等式,不能得到预期效果// printf发现一直都不成立,很是奇怪 左边是无符号整型 右边是有符号整型// 如果加一个(int)temp.size()就会立刻好用// 测试数据// I am studying Programming language C in Peking University#include<bits/stdc++.h>using namespace std;string s;string maxs, mins;int maxn = -1, minn = 2e9;bool check(int i){ if (s[i] == ' ' || s[i] == ',') return false; return true;}int main(){ getline(cin, s); for (int i = 0, len = s.size(); i < len; i++){ int j = i; string temp; while (j < len && check(j)) temp += s[j++]; cout << temp.size() << ' ' << maxn << ' ' << minn << '\n'; if (temp.size() > maxn){ maxn = (int)temp.size(); maxs = temp; } if (temp.size() < minn){ minn = (int)temp.size(); mins = temp; } i = j; while (i < len && !check(i)) i++; i--; } cout << maxs << '\n' << mins << '\n'; return 0;}