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"; // 3
cout << v[1] << "\n"; // 2
cout << v[2] << "\n"; // 5
for (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"; // 2
v.pop_back();
cout << v.back() << "\n"; // 5
// size 10, initial value 0
vector<int> v(10);
// size 10, initial value 5
vector<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;
}