C++小知识

文章目录

    • 1、c++求和函数:accumulate
      • 小用法:
    • 2、find()函数:在指定范围内查找和目标元素值相等的第一个元素
      • 小用法:
    • 3、c++字符串分割函数实现
    • 4、c++字符串反转函数
      • 小用法
    • 5、partition函数和stable_partition函数
      • 小用法
    • 6、哈希映射 按值排序
      • 小用法
    • 7、判断一个字符是否为数字或者字母

1、c++求和函数:accumulate

#include
//前两个参数是累加的元素范围 第三个参数是累加和的初值
int sum = accumulate(vec.begin() , vec.end() , 42);  

小用法:

寻找数组的中心索引
给你一个整数数组nums,请编写一个能够返回数组“中心下标”的方法。数组中心下标是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。如果数组不存在中心下标,返回-1。如果数组有多个中心下标,应该返回最靠近左边的那一个。
注意:中心下标可能出现在数组的两端。
实例
C++小知识_第1张图片
题解:[0,i],[i+1,n-1]

class Solution {
     
public:
    int pivotIndex(vector<int>& nums) {
     
        //寻找数组的中心索引
        //遍历数组
        for(int i = 0;i<nums.size();i++){
     
            //判断i是否为中心索引
            if(accumulate(nums.begin(),nums.begin()+i,0) == accumulate(nums.begin()+i+1,nums.end(),0)){
     
                return i;
            }
        }
        //不存在 
        return -1;
    }
};

2、find()函数:在指定范围内查找和目标元素值相等的第一个元素

如下是find() 函数的语法格式:

InputIterator find (InputIterator first, InputIterator last, const T& val);

其中,first 和 last 为输入迭代器,[first, last) 用于指定该函数的查找范围;val 为要查找的目标元素。
该函数会返回一个输入迭代器,当 find() 函数查找成功时,其指向的是在 [first, last) 区域内查找到的第一个目标元素;如果查找失败,则该迭代器的指向和 last 相同。
即判断元素是否存在:

//target为目标值
vector<int>::iterator result = find(vec.begin(), vec.end(), target); 
if(result == vec.end()){
     
    //不存在
}else{
     
   //存在
}

distance()函数用于计算两个迭代器表示的范围内包含元素的个数,其语法格式如下:

template<class InputIterator>
  typename iterator_traits<InputIterator>::difference_type distance (InputIterator first, InputIterator last);

其中,first 和 last 都为迭代器,其类型可以是输入迭代器、前向迭代器、双向迭代器以及随机访问迭代器;该函数会返回[first, last)范围内包含的元素的个数。
由此可以用该函数返回目标元素的索引值:使用前需要加上头文件,以及命名空间

#include 
using namespace std;

获得索引值用法如下:

//接上述代码
int index = distance(vec.begin(), result);

小用法:

搜索插入位置
C++小知识_第2张图片
题解

class Solution {
     
public:
    int searchInsert(vector<int>& nums, int target) {
     
        //寻找目标值 返回索引 否则返回其对应位置索引
        int n = nums.size();
        //查找target
        vector<int>::iterator result = find(nums.begin(), nums.end(), target); 
        //不存在时
        if(result == nums.end()){
     
            //遍历以插入
            for(int i = 0;i<n;i++){
     
                //小于等于 插入
                if(target<=nums[i]){
     
                    return i;
                }
                //大于 什么也不做
            }
            //出了循环 说明target值比所有元素都大
            return n;
        }else{
     
            //存在
            int index = distance(nums.begin(), result);
            return index;
        }
    }
};

3、c++字符串分割函数实现

vector<string> split(const string &str, const string &pattern){
     
        vector<string> res;
        if(str == "")
            return res;
        //在字符串末尾也加入分隔符,方便截取最后一段
        string strs = str + pattern;
        size_t pos = strs.find(pattern);
        while(pos != strs.npos)
        {
     
            string temp = strs.substr(0, pos);
            res.push_back(temp);
            //去掉已分割的字符串,在剩下的字符串中进行分割
            strs = strs.substr(pos+1, strs.size());
            pos = strs.find(pattern);
        }
        return res;
    }

4、c++字符串反转函数

 #include 
 string str = "hello";
 //改函数仅对string对象有用
 reverse(str.begin(),str.end());

小用法

反转字符串中的单词:给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

class Solution {
     
public:
    string reverseWords(string s) {
     
        //首先将每个单词分割开
        vector<string> strs;
        //使用一个变量记录每一个单词的开头下标
        int index = 0;
        for(int i = 0;i<s.length();i++){
     
            if(s[i] == ' '){
     
                //如果是空格
                //substr第二个参数是长度 i-index
                strs.push_back(s.substr(index,i-index));
                //由于字符串中不会有多余的空格 因而index的位置可以直接确定
                index = i+1;
                i++;
            }
            //最后一个单词
            if(i == s.length()-1){
     
                 strs.push_back(s.substr(index,i-index+1));
            }
        }
        //将strs中的字符串反转 并且拼接到字符串中
        string result;
        for(int i = 0;i<strs.size();i++){
     
            reverse(strs[i].begin(),strs[i].end());
                        result += strs[i];
            if(i != strs.size()-1){
     
                 result += " ";
            }
        }
        return result;
    }
};

5、partition函数和stable_partition函数

partition函数

#include
template< class ForwardIt, class UnaryPredicate >
ForwardIt partition( ForwardIt first, ForwardIt last, UnaryPredicate pred );

对[first,last]元素进行处理,使得满足条件pred(筛选规则)的元素移到前边,不满足的移到后面,该函数可能会改变各组原始元素的相对位置。该函数会返回一个正向迭代器,其指向的是两部分数据的分界位置,更确切地说:指向的是第二组数据中的第一个元素。

stable_partition()函数:

#include
BidirectionalIterator stable_partition (BidirectionalIterator first,
                                        BidirectionalIterator last,
                                        UnaryPredicate pred);

该函数作用同partition函数作用一样,不同的是该函数并不会改变各组元素的相对位置。同样有返回值,指向第二组数据中的第一个元素。

小用法

移动零
C++小知识_第3张图片
题解:

class Solution {
     
public:
    void moveZeroes(vector<int>& nums) {
     
        //移动零 使用stl中的分组函数 且不改变元素的相对位置
        stable_partition(nums.begin(),nums.end(),[](int a){
     
            //不为零的将被移动到前面
            return a!=0;
        });
    }
};

6、哈希映射 按值排序

    //排序所需函数
    static bool CmpByValue(const pair<int,int>& lhs, const pair<int,int>& rhs) {
     
        //降序
        return lhs.second > rhs.second;
    }
   //排序时用法 转换为pair 排序后是一个pair数组
   vector<pair<int,int>> sortValue(hashmap.begin(),hashmap.end());
   sort(sortValue.begin(),sortValue.end(),CmpByValue);

小用法

前k个高频元素

7、判断一个字符是否为数字或者字母

#include
char c = '2';
if(isdigit(c)!=0){
     
    //是数字
    
}
if(isalpha(c)!=0){
     
    //是字母
    
}

你可能感兴趣的:(c++常用函数,c++)