c++笔记

文章目录

        • 1. c++ fill和memset函数区别
        • 2. c++ 求和运算
        • 3. c++ 中的lower_bound()函数,upper_bound()函数及其应用
        • 4. c++中的string中的 atoi、stoi、stod、to_string等函数

1. c++ fill和memset函数区别

参考

  • memset函数
    • 按照字节填充某字符
    • 在头文件cstring里面
  • fill函数
    • 按照单元赋值,将一个区间的元素都赋同一个值
    • 在头文件algorithm里面
  • 因为memset函数按照字节填充,所以一般memset只能用来填充char型数组,(因为只有char型占一个字节)如果填充int型数组,除了0和-1,其他的不能。因为只有00000000 = 0,-1同理,如果我们把每一位都填充“1”,会导致变成填充入“11111111”
  • 而fill函数可以赋值任何,而且使用方法特别简便:
    • fill(arr, arr + n, 要填入的内容);
    • 例如:
#include 
#include 
using namespace std;
int main() {
    int arr[10];
    fill(arr, arr + 10, 2);
    return 0;
}
  • vector也可以:
#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;
}    
  • 而memset的使用方法是:
#include 
#include 
using namespace std;
int main(){
    int a[20];
    memset(a, 0, sizeof a);
    return 0;
}

2. c++ 求和运算

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;
}

3. c++ 中的lower_bound()函数,upper_bound()函数及其应用

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;
    }
};

4. c++中的string中的 atoi、stoi、stod、to_string等函数

  • 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

    将数值转化为字符串,返回对应的字符串。

你可能感兴趣的:(c++)