leetcode刷题-c++语法基础

pair

std::pair 是一个用来存储两个值的简单容器。它的两个值可以是相同类型或者不同类型。std::pair 是定义在头文件 中,常用于那些需要将两个相关联的数据作为单个单位处理的情况。
是std::map 和 std::unordered_map 中的元素
'''
std::pair<int, std::string> myPair(100, "example");
// 可以使用 make_pair 快速创建 pair 对象,(在 C++11 及以后的版本中,通常你可以略去 make_pair,直接使用花括号初始化)。
auto anotherPair = std::make_pair(42, "Hello World");

std::map<int, std::string> myMap;
// 向 map 中插入元素时,元素是 std::pair 类型
myMap.insert(std::make_pair(1, "One"));
myMap.insert(std::pair<int, std::string>(2, "Two"));
myMap[3] = "Three";
// 用 auto & 遍历 map
for (const auto &pair : myMap) {
std::cout << "Key: " << pair.first << "; Value: " << pair.second << std::endl;

'''

new

在 C++ 中,new 关键字用于在堆(heap)上动态分配内存。这与在栈(stack)上分配内存相对,后者通常通过声明局部变量实现。使用 new 可以在程序运行时根据需要分配确切数量的内存,并且这部分内存会一直保留,直到显式地使用 delete 关键字进行释放。

TreeNode* p=new TreeNode(10) // 创建一个节点并调用初始化
TypeName* pointer = new TypeName; //分配单个对象的内存:
TypeName* pointer = new TypeName(arguments);// 分配一个对象并调用其构造函数(如果有参数)
TypeName* pointer = new TypeName[10] ; // 分配10个对象的组
int* myInt = new int; // 分配内存用于存储一个int值
float* myFloat = new float(3.14f); // 分配内存并初始化为3.14
int* myArray = new int[10]; // 分配一个10个int元素的数组
int* myArray = new int[5]{1, 2, 3, 4, 5}; // 分配并初始化一个整数数组
delete ptr; // 释放单个对象
delete[] arr; // 释放数组:

vector

常用size() empty() front() back() push_back() pop_back() emplace_back()
insert(const_iterator position, const value_type& val):在迭代器 position 前插入 val。
erase(const_iterator position):移除 position 位置的元素。
erase(const_iterator first, const_iterator last):移除区间 [first, last) 内的所有元素。
clear() noexcept:移除 vector 中的所有元素。

初始化

std::vector<int> v1; // 一个空的整数 vector
std::vector<int> v2(10); // 一个大小为10的整数 vector,所有元素都是0
std::vector<int> v3(10, 42); // 一个大小为10的整数 vector,所有元素都是42
std::vector<int> v4 = {1, 2, 3, 4, 5}; // 使用初始值列表的 vector 初始化
std::vector<int> v4{1, 2, 3, 4, 5}; // 或者省略等号
std::vector<vector<int>> g(n, vector<int>(n, inf)); // 二维数组

vector.resize

改变大小和开辟空间

 // 将vector扩大至5个元素,默认新元素值为0
vec.resize(5);
// 用特定值10重新调整vector大小,将大小改为7
vec.resize(7, 10);
// 初始化二维矩阵
vec.resize(m, vector<int>(n)); //第一个行数,第二个每行的内容

vector之间复制

//vector用其他vector初始化
 vector<int> repeat(nums);
 vector<int> repeat(nums.begin(), nums.end());
// 确保 b 有足够空间来存放新内容
b.resize(3); // 选择 3 作为目标大小因为我们想要复制 3 个元素
//使用 assign 复制范围内的元素
b.assign(a.begin() + 2, a.begin() + 5);
// 使用 std::copy 复制范围内的元素
 std::copy(a.begin() + 2, a.begin() + 5, b.begin());

priority_queue

优先队列,默认大顶堆,常用成员函数push top pop empty

初始化

priority_queue<int> pq;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> q; //默认按照pair的<运算排序,按照第一个排,第一个相同再按第二个排列 

控制排序

方式1 定义比较函数

class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        int size = lists.size();
        // 虚拟头结点
        ListNode* dummy = new ListNode(-1);
        ListNode* p = dummy;
        // 优先级队列,最小堆
        priority_queue<ListNode*, vector<ListNode*>, compare > pq;
        // 将 k 个链表的头结点加入最小堆
        for (auto head : lists) {
            if (head) pq.push(head);
        }

        while (!pq.empty()) {
            // 获取最小节点,接到结果链表中
            auto node = pq.top();
            pq.pop();
            p->next = node;
            if (node->next) {
                pq.push(node->next);
            }
            // p 指针不断前进
            p = p->next;
        }
        return dummy->next;
    }
private:
    // 自定义比较函数
    struct compare {
        bool operator() (ListNode* a, ListNode* b) {
            return a->val > b->val; // 降序
        }
    };
};

方式2 lambda

priority_queue<ListNode, vector<ListNode>,[](ListNode a, ListNode b){
return a->val > b->val;} > pq;

push和emplace差异

结果一样,不过emplace直接容器内构建,还有emplace()可以直接传入构造参数不用实例

priority_queue<pair<int, int>> q;
q.push(pair<int,int>(nums[i], i));
q.emplace(nums[i], i);

unordered_set

哈希集合,无排序(和set不一样),不重复
常用成员函数insert emplace count empty erase size clear

unordered_map

    // 创建并初始化一个 unordered_map
std::unordered_map<std::string, int> myMap = {
  {"apple", 2},
    {"banana", 3},
     {"orange", 4}
  };

  // 插入新的键值对
   myMap["pear"] = 1;

    // 删除元素
myMap.erase("orange");

//查找key是否存在
myMap.count(“apple”): //0不在,1存在

    // 检查元素是否存在,如果存在,输出其数量
    if(myMap.find("banana") != myMap.end()) {
        std::cout << "banana count: " << myMap["banana"] << std::endl;
    }

    // 使用迭代器遍历 unordered_map
    for (const auto& pair : myMap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }
    for(auto it = myMap.begin(); it != myMap.end();it++){
       std::cout << it->first << ": " << it->second << std::endl;

    }
    // 获取 unordered_map 的大小
    std::cout << "Size: " << myMap.size() << std::endl;

string

sting find

size_t find(const std::string& str, size_t pos = 0) const;:查找 str 字符串从位置 pos 开始的第一次出现。

    std::string str = "Hello, World!";
    std::string toFind = "World";

    // 查找子字符串 "World"
    size_t pos = str.find(toFind);

    if (pos != std::string::npos) {
        std::cout << "Found 'World' at position: " << pos << std::endl;
    } else {
        std::cout << "'World' not found!" << std::endl;
    }

string清空

1.s.clear()
2.s.erase();//不带参数就删除所有
3.s.resize(0);
4.s = "";

    // 提取从位置 7 开始的全部字符
std::string sub1 = text.substr(7);

    // 提取从位置 0 开始的 5 个字符
std::string sub2 = text.substr(0, 5);

容器比较==

Vector undered_map支持==,逐个比较元素 包含大小顺序一样才相等

stack

stack<char> ss
Ss.top() 
ss.push(c)
ss.pop()
Ss.empty()
Ss.size()

queue

队列front() push() pop() empty() size()

INT_MAX INT_MIN LONG_MIN LONG_MAX

sort

sort 是一个非常通用和高效的算法,用于对容器中的元素进行排序。它定义在 头文件中,可以对数组和容器中的元素按照指定的顺序排列。

std::vector<int> vec = {4, 1, 3, 5, 2};
std::sort(vec.begin(), vec.end());

改变排序有三种方式,推荐第二种

1.自定义比较函数

bool compare(int a, int b) {
    return a > b; // 降序,如果a大于b就返回true
}
 std::sort(vec.begin(), vec.end(), compare);

2.lambda 表达式 c++ 11

    std::sort(vec.begin(), vec.end(), [](int a, int b) {
       return a > b; // 降序排列
    });

3.greater less(默认)

#include <functional> // std::greater<>
std::sort(vec.begin(), vec.end(), std::greater<>());
posted @ 2024-06-11 15:53  Link_Z  阅读(37)  评论(0编辑  收藏  举报