C++笔记归纳13:map & set

C++ STL 算法竞赛常用模板归纳汇总 PS:vector数组的动态长度机制是这样的,加入我首先开了一个长度为10的vector数组,当这个数组存储的元素数目大于10的时候,vector会自动开一个大小为当前vector大小的2倍的新数组vector2,并将vector的数据全部复制到vector2中去(如果再超出限度就再开一个大小是vector2的2倍的新数组vector3,以此类推……) 阅读详情

map & set

目录

map & set

一、序列式容器和关联式容器

1.1.序列式容器

1.2.关联式容器

二、set系列的使用

2.1.set容器

2.2.set的构造和迭代器

2.3.set的增删查

2.4.multiset和set的差异

2.5.与set有关的试题

试题1:两个数组的交集

试题2:环形链表II

三、map系列的使用

3.1.map容器

3.2.map的插入

3.3.map的迭代器和[]功能

3.4.insert返回值说明

3.5.multimap和map的差异

3.6.与map有关的试题

试题3:随机链表的复制

试题4:前k个高频单词


一、序列式容器和关联式容器

1.1.序列式容器

string,vector,list,deque,array,forward_list...

逻辑结构:线性

1.2.关联式容器

map,set,unordered_map,unordered_set

逻辑结构:非线性

map和set的底层为红黑树,是一颗平衡二叉搜索树

  • set是key搜索场景的结构
  • map是key/value搜索场景的结构

二、set系列的使用

2.1.set容器

T:set底层关键字的类型

比较方法:默认T支持小于比较

(注:如果想按自己的需求,可以手动实现仿函数传给第二个模板参数)

存储数据内存:从空间适配器中申请

(注:可以自己实现内存池,传给第三个参数)

底层:红黑树

增删查效率:O(logN)

迭代器遍历:搜索树的中序

2.2.set的构造和迭代器

set的构造

无参默认构造

explicit set(const key_compare & comp = key_compare(),const allocator_type & alloc = allocator_type());

迭代器区间构造

template < class InputIterator>
set(InputIterator first, InputIterator last,const key_compare & comp = key_compare(),const allocator_type & = allocator_type());

拷贝构造

set (const set& x);

初始化列表构造

set(initializer_list<value_type> il,const key_compare & comp = key_compare(),const allocator_type & alloc = allocator_type());

set的迭代器

双向迭代器

iterator->a bidirectional iterator to const value_type

正向迭代器

iterator begin();
iterator end();

反向迭代器

reverse_iterator rbegin();
reverse_iterator rend();

2.3.set的增删查

单值插入

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#include <set>

int main()
{
	set<int> s1;
	//去重+升序
	s1.insert(5);
	s1.insert(2);
	s1.insert(7);
	s1.insert(5);
	s1.insert(3);
	//去重+降序
	set<int, greater<int>> s2;
	s2.insert(5);
	s2.insert(2);
	s2.insert(7);
	s2.insert(5);
	s2.insert(3);
	//升序打印
	set<int>::iterator it1 = s1.begin();
	while (it1 != s1.end())
	{
		cout << *it1 << " ";
		++it1;
	}
	cout << endl;
	//降序打印
	set<int, greater<int>>::iterator it2 = s2.begin();
	while (it2 != s2.end())
	{
		cout << *it2 << " ";
		++it2;
	}
	cout << endl;

	return 0;
}

注:如果已经存在则插入失败

列表插入

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#include <set>

int main()
{
	set<int> s3;
	s3.insert({ 2,8,3,3,9 });
	for (auto e : s3)
	{
		cout << e << " ";
	}
	cout << endl;

	return 0;
}

注:已经在容器中存在的值不会插入

字符串插入

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#include <set>

int main()
{
	set<string> strset = {"sort","insert","add"};
	for (auto& e : strset)
	{
		cout << e << " ";
	}
	cout << endl;

	return 0;
}

注:按ASCII码进行比较

删除最小值

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#include <set>

int main()
{
	set<int> s = { 4,2,7,2,8,5,9 };
	for (auto e : s)
	{
		cout << e << " ";
	}
	cout << endl;

	//删除最小值
	s.erase(s.begin());
	for (auto e : s)
	{
		cout << e << " ";
	}
	cout << endl;
	
	return 0;
}

删除输入值

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#include <set>

int main()
{
	set<int> s = { 4,2,7,2,8,5,9 };
	for (auto e : s)
	{
		cout << e << " ";
	}
	cout << endl;

	//直接删除x
	int x;
	cin >> x;
	int num = s.erase(x);
	if (num == 0)
	{
		cout << x << "不存在!" << endl;
	}
	else
	{
		cout << "删除成功!" << endl;
	}
	for (auto e : s)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

查找+迭代器删除

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#include <set>

int main()
{
	set<int> s = { 4,2,7,2,8,5,9 };
	for (auto e : s)
	{
		cout << e << " ";
	}
	cout << endl;

	//直接查找在利用迭代器删除x
	int x;
	cin >> x;
	auto pos = s.find(x);
	if (pos != s.end())
	{
		s.erase(pos);
	}
	else
	{
		cout << x << "不存在!" << endl;
	}

	for (auto e : s)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

注:删除后的pos迭代器会失效

两种查找方法

int main()
{
	set<int> s({2,3,5,4,8,7});
	int x;

	//算法库的查找O(N)
	auto pos1 = find(s.begin(), s.end(), x);

	//set自身实现的查找O(logN)
	auto pos2 = s.find(x);

	//利用count间接实现快速查找
	cin >> x;
	if (s.count(x))
	{
		cout << x << "在!" << endl;
	}
	else
	{
		cout << x << "不存在!" << endl;
	}
	return 0;
}

区间查找删除

lower_bound

返回大于等于val位置的迭代器

iterator lower_bound(const value_type& val) const;

upper_bound

返回大于val位置的迭代器

iterator upper_bound(const value_type val) const;

示例:删除某个区间的一些值

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#include <set>


int main()
{
	std::set<int> myset;
	for (int i = 1; i < 10; i++)
	{
		myset.insert(i * 10);
	}
	for (auto e : myset)
	{
		cout << e << " ";
	}
	cout << endl;

	//删除[30,50]值

	//返回 >= 30
	//auto itlow = myset.lower_bound(30);
	//返回 > 50
	//auto itup = myset.upper_bound(50);

	//删除[25,55]值
	//返回 >= 25
	auto itlow = myset.lower_bound(25);
	//返回 > 55
	auto itup = myset.upper_bound(55);

	//删除这段区间的值
	myset.erase(itlow, itup);
	for (auto e : myset)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

2.4.multiset和set的差异

multiset和set的使用基本完全类似

主要区别:multiset支持值沉余

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#include <set>

int main()
{
	//multiset:排序,但是不去重
	multiset<int> s = { 4,2,7,2,4,8,4,5,4,9 };
	auto it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	return 0;
}

迭代器查找

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#include <set>

int main()
{
	//multiset:排序,但是不去重
	multiset<int> s = { 4,2,7,2,4,8,4,5,4,9 };
	//multiset:x可能会存在多个,find查找中序的第一个
	int x;
	cin >> x;
	auto pos = s.find(x);
	while (pos != s.end() && *pos == x)
	{
		cout << *pos << " ";
		++pos;
	}
	cout << endl;
	return 0;
}

迭代器查找+删除

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#include <set>

int main()
{
	multiset<int> s = { 4,2,7,2,4,8,4,5,4,9 };
	int x;
	cin >> x;
	auto pos = s.find(x);

	while (pos != s.end() && *pos == x)
	{
		cout << *pos << " ";
		++pos;
	}
	cout << endl;

	/*pos = s.find(x);
	while (pos != s.end() && *pos == x)
	{
		pos = s.erase(pos);
	}*/
	s.erase(x);
	auto it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	return 0;
}

count计算每个值出现次数

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#include <set>

int main()
{
	multiset<int> s = { 4,2,7,2,4,8,4,5,4,9 };
	int x;
	cin >> x;
	auto pos = s.find(x);

	while (pos != s.end() && *pos == x)
	{
		cout << *pos << " ";
		++pos;
	}
	cout << endl;
	s.erase(x);
	auto it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	cout << s.count(2) << endl;
	return 0;
}

2.5.与set有关的试题

试题1:两个数组的交集

题目内容:

给定两个数组nums1和nums2,返回它们的交集

输出结构中每个元素一定是唯一的

示例:

输入:nums1 = [1,2,2,1],num2 = [2,2]

输出:[2]

class Solution 
{
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2)
    {
        set<int> s1(nums1.begin(),nums1.end());
        set<int> s2(nums2.begin(),nums2.end());

        vector<int> ret;
        auto it1 = s1.begin();
        auto it2 = s2.begin();
        while(it1 != s1.end() && it2 != s2.end())
        {
            if(*it1 < *it2)
            {
                it1++;
            }
            else if(*it1 > *it2)
            {
                it2++;
            }
            else
            {
                ret.push_back(*it1);
                it1++;
                it2++;
            }
        }
        return ret;
    }
};

交集:相同存数据,同时++,不同小的++

差集:相同同时++,不同小的存数据后++

同步算法(叉集与并集)

假设以云相册为主

将相册(照片A,B,C)分给手机端,电脑端,平板端

当手机端输入一个新的照片D时,会和云相册作差集,将D上传到云相册

平板端与电脑端再与云相册比对,ABC是交集,而D是差集,所以会从云相册中下载照片D

当对手机端的C照片进行修改后,因为最后修改时间不同

会以时间最新的照片为准,同时其他的客户端也会同步更新

试题2:环形链表II

题目内容:

给定一个链表的头节点  head

返回链表开始入环的第一个节点

如果链表无环,则返回 null

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环

示例:

输入:head = [3,2,0,-4],pos = 1

输出:返回索引为1的链表节点

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution 
{
public:
    ListNode *detectCycle(ListNode *head) 
    {
        set<ListNode*> s;
        ListNode* cur = head;
        while(cur)
        {
            if(s.count(cur))
            {
                return cur;
            }
            else
            {
                s.insert(cur);
            }
            cur = cur->next;
        }    
        return nullptr;
    }
};

三、map系列的使用

3.1.map容器

Key:key

T:value

3.2.map的插入

pair类类型:

typedef pair<const Key, T> value_type;

template < class T1, class T2>
struct pair
{
	typedef T1 first_type;
	typedef T2 second_type;
	
	T1 first;
	T2 second;
	
	pair() : first(T1()), second(T2())
	{}
	
	pair(const T1 & a, const T2 & b) : first(a), second(b)
	{}
	
	template < class U, class V>
	pair(const pair<U, V>&pr) : first(pr.first), second(pr.second)
	{}
};

make_pair函数模板:自动判断参数类型,并且返回

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#include <map>

int main()
{
    //默认无参构造
	//map<string, string> dict;
	//initializer_list列表构造
	map<string, string>dict = { {"left","左边"},{"right","右边"},{"insert","插入"},{"string","字符串"} };

	//法1:
	pair<string, string> kv1("first", "第一个");
	dict.insert(kv1);

	//法2:
	dict.insert(pair<string, string>("second", "第二个"));

	//法3:
	dict.insert(make_pair("sort", "排序"));

	//法4:(C++11,多参数隐式类型转接)
	dict.insert({ "auto","自动的" });

	//遍历打印
	map<string, string>::iterator it = dict.begin();
	while (it != dict.end())
	{
		//可以修改value,不支持修改key
		//it->first += 'x';
		it->second += 'x';
		cout << (*it).first << (*it).second << endl;
		cout << it->first << it->second << endl;
		cout << it.operator->()->first << it.operator->()->second << endl;
		++it;
	}
	cout << endl;

	return 0;
}

注:插入时,如果key相同,value不相等时,数据不会更新

3.3.map的迭代器和[]功能

示例1:

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#include <map>

int main()
{
	//利用find和iterator修改功能,统计水果出现的次数
	string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜","苹果", "香蕉", "苹果", "香蕉" };
	map<string, int> countMap;

	for (const auto& str : arr)
	{
		//先查找水果在不在map中
		//不在:说明水果第一次出现,则插入{水果, 1}
		//在:则查找到的节点中水果对应的次数++
		auto ret = countMap.find(str);
		if (ret == countMap.end())
		{
			countMap.insert({ str, 1 });
		}
		else
		{
			ret->second++;
		}
	}
	for (const auto& e : countMap)
	{
		cout << e.first << ":" << e.second << endl;
	}
	cout << endl;

	return 0;
}

示例2:

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#include <map>

int main()
{
	//利用find和iterator修改功能,统计水果出现的次数
	string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜","苹果", "香蕉", "苹果", "香蕉" };
	map<string, int> countMap;
	for (const auto& str : arr)
	{
		//[]先查找水果在不在map中
		//不在:说明水果第一次出现,则插入{水果, 0},同时返回次数的引用,++一下就变成1次了
		//在:则返回水果对应的次数++
		 countMap[str]++;
	}
	
	for (const auto& e : countMap)
	{
		cout << e.first << ":" << e.second << endl;
	}
	cout << endl;

	return 0;
}

 示例3:

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#include <map>

int main()
{
	map<string, string> dict;
	dict.insert(make_pair("sort", "排序"));

	//插入{"insert", string()} (key不在)
	dict["insert"];
	
	//插入+修改
	dict["left"] = "左边";
	
	//修改
	dict["left"] = "左边、剩余";
	
	//查找(key在)
	cout << dict["left"] << endl;

	//插入{"right",string()} (key不在)
	cout << dict["right"] << endl;
	
	return 0;
}

注:

str不存在时[]的功能:插入+修改

str存在时[]的功能:查找+修改

3.4.insert返回值说明


The single element versions (1) return a pair, with its member

pair::first set to an iterator pointing to either the newly inserted element or to the

element with an equivalent key in the map.

The pair::second element in the pair is set to true if a new element was inserted or false if an

equivalent key already existed.

insert插入一个pair<key, T>对象

如果key在map中,插入失败,则返回一个pair<iterator,bool>对象

返回pair对象:first是key所在结点的迭代器,second是false

如果key不在map中,插入成功,则返回一个pair<iterator,bool>对象

返回pair对象:first是新插入key所在结点的迭代器,second是true

无论插入成功还是失败,返回pair<iterator,bool>对象的first都会指向key所在的迭代器

意味着insert插入失败时充当了查找的功能,所以insert可以用来实现operator[]

注:这里有两个pair

  • map底层红黑树节点中存的pair<key, T>
  • insert返回值pair<iterator,bool>

operator[]的内部实现

// operator的内部实现
mapped_type& operator[] (const key_type& k)
{
	//如果k不在map中:
	//insert会插入k和mapped_type默认值,同时[]返回结点中存储mapped_type值的引用
	//可以通过引用修改返映射值,所以[]具备了插入 + 修改功能

	//如果k在map中:
	//insert会插入失败,但是insert返回pair对象的first是指向key结点的迭代器
	//返回值同时[]返回结点中存储mapped_type值的引用,所以[]具备了查找 + 修改功能

	pair<iterator, bool> ret = insert({ k, mapped_type() });
	iterator it = ret.first;
	return it->second;
}

3.5.multimap和map的差异

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#include <map>

int main()
{
	multimap<string, string> dict;
	dict.insert({ "sort","排序" });
	dict.insert({ "sort","排序" });
	dict.insert({ "sort","排序1" });
	dict.insert({ "sort","排序2" });
	dict.insert({ "sort","排序3" });
	dict.insert({ "string","字符串" });

	for (auto e : dict)
	{
		cout << e.first <<  ":" << e.second << endl;
	}

	cout << endl;
	dict.erase("sort");

	for (auto e : dict)
	{
		cout << e.first << ":" << e.second << endl;
	}

	return 0;
}

3.6.与map有关的试题

试题3:随机链表的复制

题目内容:

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针random

该指针可以指向链表中的任何节点或空节点,构造这个链表的深拷贝

深拷贝应该正好由 n 个全新节点组成

每个新节点的值都设为其对应的原节点的值

新节点的 next 指针和 random 指针也都应指向复制链表中的新节点

并使原链表和复制链表中的这些指针能够表示相同的链表状态

复制链表中的指针都不应指向原链表中的节点

示例:

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

class Solution {
public:
	Node * copyRandomList(Node * head) 
	{
		map<Node*, Node*> nodeMap;
		Node * copyhead = nullptr, *copytail = nullptr;
		Node * cur = head;
		while (cur)
		{
			if (copytail == nullptr)
			{
				copyhead = copytail = new Node(cur->val);
			}
			else
			{
				copytail->next = new Node(cur->val);
				copytail = copytail->next;
			}
			
			//原节点和拷⻉节点map kv存储
			nodeMap[cur] = copytail;
			
			cur = cur->next;
		}
		
		//处理random
		cur = head;
		Node * copy = copyhead;
		while (cur)
		{
			if (cur->random == nullptr)
			{
				copy->random = nullptr;
			}
			else
			{
				copy->random = nodeMap[cur->random];
			}
			
			cur = cur->next;
			copy = copy->next;
		}
		return copyhead;
	}
};
试题4:前k个高频单词

题目内容:

给定一个单词列表 words 和一个整数 k

返回前 k 个出现次数最多的单词

返回的答案应该按单词出现频率由高到低排序

如果不同的单词有相同出现频率, 按字典顺序排序

示例:

输入:words = ["i", "love", "leetcode", "i", "love", "coding"],k = 2
输出:["i", "love"]
解析:"i" 和 "love" 为出现次数最多的两个单词,均为2次

注意:按字母顺序 "i" 在 "love" 之前。

法1:使用stable_sort

class Solution 
{
public:
    struct kvCompare
    {
        bool operator()(const pair<string,int>& kv1,const pair<string,int>& kv2)
        {
            return kv1.second > kv2.second;
        }
    };

    vector<string> topKFrequent(vector<string>& words, int k) 
    {
        map<string,int> countMap;
        for(auto& e : words)
        {
            countMap[e]++;
        }

        vector<pair<string,int>> v(countMap.begin(),countMap.end());
        stable_sort(v.begin(),v.end(),kvCompare());

        vector<string> strV;
        for(int i = 0;i < k;i++)
        {
            strV.push_back(v[i].first);
        }

        return strV;
    }
};

注:sort底层是快排,不稳定,使用stable_sort更加稳定

法2:完善仿函数

class Solution 
{
public:
    struct kvCompare
    {
        bool operator()(const pair<string,int>& kv1,const pair<string,int>& kv2)
        {
            return kv1.second > kv2.second || (kv1.second == kv2.second && kv1.first < kv2.first);
        }
    };

    vector<string> topKFrequent(vector<string>& words, int k) 
    {
        map<string,int> countMap;
        for(auto& e : words)
        {
            countMap[e]++;
        }

        vector<pair<string,int>> v(countMap.begin(),countMap.end());
        sort(v.begin(),v.end(),kvCompare());

        vector<string> strV;
        for(int i = 0;i < k;i++)
        {
            strV.push_back(v[i].first);
        }

        return strV;
    }
};

法3:使用优先级队列

class Solution 
{
public:
    struct Compare
    {
        bool operator()(const pair<string, int>& x, const pair<string, int>& y) const
        {
            //要注意优先级队列底层是反的
            //大堆要实现小于比较,所以这里次数相等
            //想要字典序小的在前面要比较字典序大的为真
            return x.second < y.second || (x.second == y.second && x.first > y.first);
        }
    };
    vector<string> topKFrequent(vector<string>& words, int k) 
    {
        map<string, int> countMap;
        for(auto& e : words)
        {
            countMap[e]++;
        }   
        //将map中的<单词,次数>放到priority_queue中
        //仿函数控制大堆,次数相同按照字典序规则排序
        priority_queue<pair<string, int>, vector<pair<string, int>>, Compare>
        p(countMap.begin(), countMap.end());
        vector<string> strV;
        for(int i = 0; i < k; ++i)
        {
            strV.push_back(p.top().first);
            p.pop();
        }
        return strV;
    }
};

现代C++演进:从C++11到C++23的核心特性与实战指南 C++作为一门高性能系统编程语言,其核心价值在于提供零成本抽象和精细的资源控制能力。其设计哲学围绕RAII(资源获取即初始化)展开,通过将资源生命周期与对象绑定,从根本上解决了手动内存管理带来的复杂性和安全隐患。这一原理催生了智能指针、移动语义等关键技术,极大地提升了代码的安全性和执行效率。随着多核处理器普及,C++标准库也引入了原生并发支持,包括线程、互斥量和内存模型,为构建高性能并发程序提供了坚实基础。这些技术广泛应用于游戏引擎、高频交易系统、嵌入式设备及大型基础设施软件等场景。本文聚焦于C++11引入 阅读详情

相关推荐

单细胞marker基因表达密度图-(还有一个包装函数)

我们借助Nebulosa,将上面的过程包装为一个函数,还是那句话,受累麻烦的事我们来解决,您轻松即可,先看看函数参数:需要注意的是,如果你只想框选某一类celltype,理想模式是这群celltype是单独聚类的,没有散落在其他类群,否则将会全部框选,效果不好,建议使用AI/PS添加。需要注意,这里我算是投机取巧了,用了一个和这个作图毫无关系的包ggnetwork,主要的目的是用他的theme_blank()主题,一次性将所有清空,当然也可以自己慢慢写,不过有现成的,为啥不用呢?这质感不就上去了嘛。

qq_42090739的博客 1367

【C++】map 和 set

map/multimap 的使用以及 set/multiset 的使用

在平淡的日子里寻找存在的价值 1630

异步bus交互(一)— 两级DFF同步器

异步bus交互(一)— 两级DFF同步器 跨时钟域处理 &amp; 亚稳态处理 1.问题产生 现在的芯片(比如SOC,片上系统)集成度和复杂度越来越高,通常一颗芯片上会有许多不同的信号工作在不同的时钟频率下。比如SOC芯片中的CPU通常会工作在一个频率上,总线信号(比如DRAM BUS)会工作在另一个时钟频率下,而普通的信号又会工作在另外的时钟频率下。这3个不同时钟频率下工作的信号往往需要相互沟通和传递信号。 不同时钟域下的信号传递就涉及到跨时钟域信号处理,因为相互之间的频率、相位不一样,如果不做处理或者

qq_44816673的博客 5118

c++——map和set的使用

如果结果不如你所愿,就在尘埃落定前奋力一搏!

Britney_dark的博客 1941

用OpenNI2获取奥比中光Astra Pro及 Astra Pro SM输出的深度图(win,linux arm64 x64平台)

搞了一个奥比中光Astra Pro,想在windows平台,和linux rk3588 上获取深度信息,之前的驱动下载已经不好用了。

babytiger的专栏 1302

定时移动鼠标点击鼠标,防止电脑息屏的vba脚本

定时移动鼠标,使系统始终处于激活状态,防止系统息屏。

panfei263031的博客 5927

C++ map、set用法总结

C++容器之map、set C++的标准模板库(Standard Template Library,简称STL)是一个容器和算法的类库,容器往往包含同一类型的数据,STL中比较常用的容器是vector,set,和map,比较常用的算法有 Sort 等。今天就来介绍一下map和set。 目录 map(映射): 特性 基本构造函数(声明方式) 插入(共三种) 大小 查找(判断关键...

l218623的博客 3166

饥荒Mod 开发(二):Mod目录结构

饥荒中的每个Mod 都有一些固定的目录结构,各个目录的放着不同类型的文件。动画,图片,源代码等。我们最好是遵守Mod 开发中的各个目录结构,我用的是WeGame 安装的饥荒游戏,Mod 目录如下,这个目录下保存所有订阅的Mod。

小乖写代码 4628

C++中Set和Map基本使用

速懂C++容器set和map的基本使用

qq_61932634的博客 901

逆向实战:基于内存态匿名段分析的 DexProtector 检测绕过策略

本文深入探讨了针对DexProtector加固方案的Frida检测绕过策略。通过分析运行时动态加载到匿名内存段的核心检测逻辑,提出了一套基于内存态分析、定位并转储匿名可执行段,进而通过精准Hook与“等式化替换”等技术实现稳定绕过的实战方法。该方法不仅适用于DexProtector,也对采用类似内存隐藏技术的加固方案具有参考价值。

ik678901的博客 512

YOLOv11改进有效系列目录 - 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制 - 针对多尺度、小目标、遮挡、恶劣天气等问题

在一些特定情况下,目标检测任务由于多种因素的影响,变得更加复杂和困难。以下是几类常见的困难目标检测场景:1. 小目标检测定义:小目标检测是指当目标在图像中的占比非常小时,模型需要准确识别和定位这些目标。典型场景包括远程监控、卫星图像分析等。挑战1. 低分辨率:由于目标在图像中占据像素较少,细节缺失,特征提取难度增加。2. 特征不足:小目标缺乏明显的形状和纹理特征,容易被复杂背景淹没。3. 检测难度大:由于小目标与背景之间的对比度较低,误检的几率上升。4. 数据不平衡。

qq_64693987的博客 4万+

C++——map和set

map与set知识讲解

dongxue727504的博客 538

1、2022 应用密码学与网络安全会议亮点与关键技术解读

2022年应用密码学与网络安全会议(ACNS 2022)在意大利罗马成功举办,会议涵盖了密码学与网络安全的多个前沿领域,包括键控全同态加密、隐私保护技术、区块链、后量子密码学和多方计算等。会议共收录44篇论文,展示了众多创新的研究成果,为学术研究和实际应用提供了新的思路和方法。本次会议促进了学术界和工业界的交流与合作,推动了密码学与网络安全行业的发展。

blue的专栏 182

【复习整理归纳】| C++面经(STL及项目)

run函数内部创建idle协程用来执行idle以及一个执行协程,会先去任务队列中获取任务,获取到任务后通知执行,如果没有任务可取,则陷入idle中;起初采用将虚表扩大,让此处容纳所需的this指针,此时表中每一个slot不在是一个指针,而是一个集合体,内含offset以及函数地址;【Servlet】:为基类,提供名字来区分不同的服务器,其中继承的子类需要实现handle对请求做出相应的处理,设置响应信息;stop函数,首先判断停止条件是否满足,若不满足,则还有任务没有执行完毕,则提醒一下协程,有任务进来;

weixin_45926547的博客 1553

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++面试题之问题归纳

基础知识点 1.C与C++有什么区别,C++有哪些特征?说说多态是怎么实现的(C++内存模型)? 2.构造函数可以是虚函数吗,为什么? 3.析构函数可以是虚函数吗,什么时候必须为虚函数,为什么? 4.子类析构要调用父类的析构函数吗? 5.C++空类默认有哪些成员函数(提示6种)? 6.什么情况下需要调用拷贝构造函数? 7.类的静态成员与非静态成员有哪些区别? 8.说说纯虚函数,虚函数,多态(虚指针,虚函数表),this指针 9.说说堆和栈(内存布局,内核空间,用户空间) 10.重载,重写(覆盖)与隐藏的区别

kevin_org 649

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C++ STL基本概念和使用方法

长久以来,软件界一直希望建立一种可重复利用的东西,以及一种得以制造出”可重复运用的东西”的方法,让程序员的心血不止于随时间的迁移,人事异动而烟消云散,从函数(functions),类别(classes),函数库(function libraries),类别库(class libraries)、各种组件,从模块化设计,到面向对象(object oriented ),到模式(pattern)的归纳整理,为的就是复用性的提升。 复用性必须建立在某种标准之上。但是在许多环境下,就连软件开发最基本的数据结构(data

qq_51969153的博客 1842

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

2021-06-22 C++面试知识点归纳

C++基础 1、面向对象的三大特性:封装、继承、多态 2、类的访问权限:private、protected、public 3、类的构造函数、析构函数、赋值函数、拷贝函数 4、移动构造函数与拷贝构造函数对比 5、深拷贝与浅拷贝的区别 6、空类有哪些函数?空类的大小? 7、内存分区:全局区、堆区、栈区、常量区、代码区 8、C++与C的区别 9、struct与class的区别 10、struct内存对齐 11、new/delete与malloc/free的区别 12、内存泄露的情况 13、sizeof与strle

weixin_44583590的博客 239

vijos - P1279Leave-绿光(数学归纳法 + python)

P1279Leave-绿光 Accepted 标签:[显示标签] 背景 期待这一份幸运,和一份冲劲,多么奇妙的际遇……。燕姿在演唱完绿光这首歌后,出给了姿迷一个考题。 北欧有一个传说! 人一生中能看见绿光! 他就一生都可以得到幸福! 描述 燕姿唱完这首歌,天上降落了一道绿光,在地上形成了一个矩形的

qq_18661257的专栏 1188

Eastmount博客导读:专栏系统分类和博客归纳总结

为了更好地帮助博友学习作者的博客,方便作者自己归纳总结专栏,本文详细介绍了作者八年来,在优快云写的各种专栏,各种系列文章。八年来,作者经历了从本科到硕士,到贵州教书成家,再到现在的博士。八年来,作者学得很杂很宽,绝大多数专栏都是从零学起,这期间起起伏伏,跌跌撞撞,感恩所有读者与我同行,也感谢优快云记录了这所有的一切。未来,希望自己能继续分享更好的文章,与所有人一起进步。到了2020年,作者将写一篇《感恩同行:我与优快云的这八年》,加油~

杨秀璋的专栏 2万+

【C++篇】STL标准模板库

友情链接:C/C++系列系统学习目录 知识点内容正确性以C++ Primer(中文版第五版)、C++ Primer Plus(中文版第六版)为标准,同时参考其它各类书籍、优质文章等,总结归纳出个人认为较有逻辑的整体框架,以至减少知识点上的错误,同时方便本人的基础复习,也希望能帮助到大家 &nbsp; 最好的好人,都是犯过错误的过来人;一个人往往因为有一点小小的缺点,将来会变得更好。如有错漏之处,敬请指正,有更好的方法,也希望不吝提出。最好的生活方式就是和努力的大家,一起奔跑在路上 文章目录🚀一、STL

陈七的博客,学习知识分享,期待与大家的交流 1768

LeetCode 13. Roman to Integer 题解(C++)

Given a roman numeral, convert it to an integer.

prayyojay的博客 922

ROS Wiki教程归纳

1,ROS在多机器人上的使用:http://wiki.ros.org/cn/ROS/Tutorials/MultipleMachines 2,ROS ssh网络通信:http://wiki.ros.org/ROS/NetworkSetup 3,ROS发布nav_msgs/Odometry里程计消息:http://wiki.ros.org/navigation/Tutorials/RobotSe...

Lorkmorn的博客 2642

C++模板——(4)C++泛型编程与标准模板库简介

C++模板——(4)C++泛型编程与标准模板库简介 容器: 1、向量: 2列表: 3、集合: 4、双端队列: 5、栈: 6.映射: 例:使用向量,将字符串传送到字符向量中并显示。 四、算法: 五、选代器:

一个正在学习C/C++的博主 1938

Standard Template Libary or C++ Standard Library

  C++提供一套标准的library称为C++ standard library完全以template完成,所以又被称为Standard Template Library。这套library专门有于实现常用的据结构(例如arry、list......)以及常用的算法(例如push,pop,insert,delete,query,retrieval......)。   一般来说,STL包含六个主...

weixin_42505576的博客 246

C++ STL实战指南:从容器、迭代器到算法与内存管理的全面解析

泛型编程是现代C++高效开发的核心思想,它通过模板技术实现了数据结构和算法的解耦与复用。其原理在于将类型参数化,使得同一套代码能够适用于多种数据类型,从而大幅提升代码的复用性和开发效率。这一技术的核心价值在于构建了标准化的组件库,让开发者无需重复造轮子,并能专注于业务逻辑。在系统编程、高性能计算和大型软件框架等应用场景中,泛型编程思想尤为重要。C++标准模板库(STL)正是这一思想的典范实现,它通过容器、迭代器、算法等组件的协同,提供了强大的通用编程能力。本文深入探讨了STL的六大组件架构,并重点解析了容器

weixin_33742618的博客 507

【算法日记 13】LeetCode 49. 字母异位词分组:哈希表的进阶“降维打击”

这道题完美诠释了“数据预处理(排序) + 哈希表分组”的黄金组合。掌握了这个套路,以后遇到类似的“分类归纳”问题,都能做到秒杀!

aqiu111111的博客 191
上一篇: C++笔记归纳12:二叉搜索树
下一篇: C++笔记归纳14:AVL树
時語風華
博客等级 码龄1年 106粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值