参考
cstring
里面algorithm
里面#include
#include
using namespace std;
int main() {
int arr[10];
fill(arr, arr + 10, 2);
return 0;
}
#include
#include
#include
using namespace std;
int main(){
vector v{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
fill(v.begin(), v.end(), -1);
return 0;
}
#include
#include
using namespace std;
int main(){
int a[20];
memset(a, 0, sizeof a);
return 0;
}
accumulate定义在#include
accumulate(s.begin(), s.end(), 0)
accumulate带有三个形参:头两个形参指定要累加的元素范围,第三个形参则是累加的初值
#include
#include
#include
#include
using namespace std;
int main(){
int a[5] = {4,1,2,1,2};
set s(a,a+5);
set s2;
cout<< accumulate(s.begin(),s.end(), 0) ;
// adjacent_difference(s.begin(), s.end(), b);
for (auto n : s) {
std::cout << n << ' ';
}
return 0;
}
// 实现将 字符拼接成一个string
int main(){
set v = {'a', 'b' ,'c'};
string sum = accumulate(v.begin() , v.end() , string(""));
cout<
// 自定义的数据类型
struct Grade
{
string name;
int grade;
};
int main()
{
Grade subject[3] = {
{ "English", 80 },
{ "Biology", 70 },
{ "History", 90 }
};
int sum = accumulate(subject, subject + 3, 0, [](int a, Grade b){return a + b.grade; });
cout << sum << endl;
system("pause");
return 0;
}
C++ Refference
template <class ForwardIterator, class T>
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last,
const T& val);
template <class ForwardIterator, class T, class Compare>
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last,
const T& val, Compare comp);
第一个first参数是一段连续空间的首地址,last是连续空间末端的地址,val是要查找的值。调用lower_bound()的前提是这段连续的空间里的元素是有序(递增)的。
然后lower_bound()的返回值是第一个大于等于val的值的地址,用这个地址减去first,得到的就是第一个大于等于val的值的下标。
在自定义版本里有一个comp参数,它的用处在于,当你要查找的不是基本数据类型,而是自己定义比较函数。
lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
lower_bound( begin,end,num,greater() ):从数组的begin位置到end-1位置二分查找第一个小于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
upper_bound( begin,end,num,greater() ):从数组的begin位置到end-1位置二分查找第一个小于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
#include
using namespace std;
const int maxn=100000+10;
const int INF=2*int(1e9)+10;
#define LL long long
int cmd(int a,int b){
return a>b;
}
int main(){
int num[6]={1,2,4,7,15,34};
sort(num,num+6); //按从小到大排序
int pos1=lower_bound(num,num+6,7)-num; //返回数组中第一个大于或等于被查数的值
int pos2=upper_bound(num,num+6,7)-num; //返回数组中第一个大于被查数的值
cout<())-num; //返回数组中第一个小于或等于被查数的值
int pos4=upper_bound(num,num+6,7,greater())-num; //返回数组中第一个小于被查数的值
cout<
#include
#include
using namespace std;
struct point{
point(){
}
point(int _x, int _y){
x = _x;
y = _y;
}
int x;
int y;
};
bool cmp(point a, point b){
return a.x < b.x;
}
int main(int argc, char *argv[]){
point a[5];
a[0].x = 1;
a[0].y = 100;
a[1].x = 100;
a[1].y = 1;
a[2].x = 30;
a[2].y = 50;
a[3].x = 25;
a[3].y = 120;
a[4].x = 301;
a[4].y = 103;
// 随便赋值
sort(a, a + 5, cmp);
// 先排序
for (int i = 0; i < 5; i++){
printf("a[%d].x = %d, a[%d].y = %d\n", i, a[i].x, i, a[i].y);
}
// 输出会发现他们按照x从小到大排序了
cout << (lower_bound(a, a + 5, point(1, 1000), cmp) - a) << endl;
// 第一个x值大于1的元素是(1, 100)这个元素,它的下标为0
cout << (lower_bound(a, a + 5, point(101, 1000), cmp) - a) << endl;
// 第一个x值大于101的元素是(301, 103)这个元素,它的下标为4
cout << (lower_bound(a, a + 5, point(1000, 1000), cmp) - a) << endl;
// 因为找不到所以返回a + 5,再减a就是5
}
给定一个已经排序的整数型数组和一个指定的目标值,找出目标值在该数组中出现的起始位置,如果不存在,返回[-1, -1]。例如:输入数组[5, 7, 7, 8, 8, 10] 和 数字8, 输出[3, 4]。
// 使用库函数
class Solution {
public:
vector searchRange(vector& nums, int target) {
const int l = distance(nums.begin(), lower_bound(nums.begin(), nums.end(), target));
const int u = distance(nums.begin(), prev(upper_bound(nums.begin(), nums.end()
if (nums[l] != target) // not found
return vector { -1, -1 };
else
return vector { l, u };
}
};
// 使用自定义的函数
public:
vector searchRange (vector& nums, int target) {
auto lower = lower_bound(nums.begin(), nums.end(), target);
auto uppper = upper_bound(lower, nums.end(), target);
if (lower == nums.end() || *lower != target)
return vector { -1, -1 };
else
return vector {distance(nums.begin(), lower), distance(nums.begin(), pre
}
template
ForwardIterator lower_bound (ForwardIterator first,
ForwardIterator last, T value) {
while (first != last) {
auto mid = next(first, distance(first, last) / 2);
if (value > *mid)
first = ++mid;
else
last = mid;
}
return first;
}
template
ForwardIterator upper_bound (ForwardIterator first,
ForwardIterator last, T value) {
while (first != last) {
auto mid = next(first, distance (first, last) / 2);
if (value >= *mid)
first = ++mid; // 与lower_bound 仅此不同
else
last = mid;
}
return first;
}
};
atoi和stoi的异同点
atoi()的参数是 const char*
,因此对于一个字符串str
我们必须调用 c_str()
的方法把这个string
转换成 const char
*类型的,而stoi()
的参数是const string
,不需要转化为 const char
;
string s = "123456";
cout<
stoi()会做范围检查,默认范围是在int
的范围内(-2147483648 ~ 2147483647)的,如果超出范围的话则会runtime error!
atoi()不会做范围检查,如果超出范围的话,超出上界,则输出上界,超出下界,则输出下界;
string s2 = "2147483648";
cout<
stoi和stod的异同点
如果遇到非法输入,stoi会自动截取最前面的数字,直到遇到不是数字为止;
如果是非法输入,stod会截取最前面的浮点数,直到遇到不满足浮点数为止。
string str="123.4356";
cout<
to_string
将数值转化为字符串,返回对应的字符串。