失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > leetcode中使用c++需要注意的点以及各类容器的初始化 常用成员函数

leetcode中使用c++需要注意的点以及各类容器的初始化 常用成员函数

时间:2022-11-02 21:39:28

相关推荐

leetcode中使用c++需要注意的点以及各类容器的初始化 常用成员函数

目录

1、传引用2、vector使用初始化方法常用成员函数3、字符串string初始化方法常用成员函数4、哈希表 unordered_map初始化常用成员函数示例:计数器5、哈希集合 unordered_set初始化常用成员函数6、队列 queue初始化成员函数7、栈stack初始化常用成员函数7、emplace_back 与 push_back的区别8、vector 中“=”是深复制,拷贝构造也是深复制8、vector swap()、assign()用法

1、传引用

C++函数参数默认是传值的,如果使用数组之类的容器作为参数,一般会加上&符号表示传引用。

没有加&,就是传值,会涉及到数据复制。在递归函数中,每次递归都会复制一遍容器,非常耗时

2、vector使用

初始化方法

//初始化一个int型的空数组numsvector<int> nums;//初始化一个大小为n的数组nums,数组中的值默认为0vector<int> nums(n);//初始化一个元素为1、2、3的数组numsvector<int> nums{1,3,5};//初始化一个大小为n的数组nums,其值全都为2vector<int> nums(n,2);//初始化一个二维int数组dpvector<vector<int>> dp;//初始化一个大小为m * n的布尔数组dp//值均为truevector<vector<bool>> dp(m,vector<bool>(n,true));

常用成员函数

//返回数组是否为空bool vector.empty()//返回元素个数size_type vector.size()//返回数组中最后一个元素的引用reference vector.back()//在数组尾部插入一个元素valvoid vector.push_back(val);//删除数组尾部元素void pop_back();

3、字符串string

初始化方法

//s是一个空字符串string s;//s是字符串"abc"stirng s = "abc";

常用成员函数

//返回字符串长度size_t s.size()//判断字符串是否为空bool s.empty()//在字符串尾部插入一个字符void s.push_back(char c);//删除字符串尾部字符void pop_back()//返回从索引pos开始,长度为len的子字符串string substr(size_t pos, size_t len)//判断两个字符串是否相等bool s1 == s2

4、哈希表 unordered_map

初始化

//初始化一个key为int,value为int的哈希表unordered_map<int,int> hash_map;//初始化一个key为string,value为int数组的哈希表unordered_map<string,vector<int>> hash_map;

常用成员函数

//返回哈希表键值对个数size_type hash_map.size();//返回哈希表是否为空bool hash_map.empty();//返回哈希表中key出现的次数//因为哈希表不会出现重复的键,所以该函数只可能返回0或1//可以用来判断key是否存在与哈希表中size_type hash_map.count(key);//通过key清除哈希表中的键值对size_type hash_map.erase(key);

需要注意的点:对于unordered_map,使用方括号[]访问键key时,如果key不存在,则会自动创建key,对应的值为默认值。

示例:计数器

vector<int> nums{1,1,3,4,5,3,6};unordered_map<int,int> counter;for(int num : nums){//可以通过[]直接访问或修改对应的键counter[num]++;}//遍历哈希表中的键值对for(auto& it : counter){int key = it.first;int val = it.second;cout << key << ": " << val << endl;}

上面的counter[num]++;实际对应了下面语句:

for(int num : nums){if(!counter.count(num)) counter[num] = 0;counter[num]++;}

5、哈希集合 unordered_set

初始化

//初始化一个存储int的哈希集合 unordered_set<int> visited;//初始化一个存储string的哈希集合unordered_set<string> visited;

常用成员函数

//返回哈希表的键值对个数size_type unordered_set.size();//返回哈希表是否为空bool unordered_set.empty();//类似哈希表,如果key存在则返回1,否则返回0size_type unordered_set.count(key);//向集合中插入一个元素keypair<iterator,bool> unordered_set.insert(key);//删除哈希集合中的元素key//如果删除成功返回1,如果key不存在返回0size_type unordered_set.erase(key);

6、队列 queue

初始化

//初始化一个存储int的队列queue<int> q;//初始化一个存储string的队列queue<string> q;

成员函数

//返回队列是否为空bool q.empty();//返回队列中元素个数size_type q.size();//将元素加入队尾void q.push(val);//返回队头元素的引用value_type& front();//删除队头元素void pop();

需要注意的是,队列pop方法一般是void类型的,不会同时返回被删除的元素,所以,如果想用被删除的元素,得先取出来;

int e = q.front();q.pop();

7、栈stack

初始化

//初始化一个存储int的堆栈stack<int> stk;//初始化一个存储string的堆栈stack<string> stk;

常用成员函数

//返回堆栈是否为空bool stk.empty();//返回堆栈中元素的个数size_type stk.size();//在栈顶添加元素void stk.push(val);//返回栈顶元素的引用value_type& stk.top();//删除栈顶元素void stk.pop();

7、emplace_back 与 push_back的区别

摘自/p/adf58f9fad84

emplace_back和push_back都有往容器后面插入一个元素的作用

不同的是

emplace_back() 和 push_back() 的区别,就在于底层实现的机制不同。push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);而 emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程

8、vector 中“=”是深复制,拷贝构造也是深复制

两个vector的地址并不相同:

int main(){int w = 100;int h = 20;vector<int> dataA(w * h, 0Xff);vector<int> dataB = dataA; // copy 构造int* ptr0 = &dataA[0];int* ptr1 = &dataB[0];cout << ptr0 << endl;cout << ptr1 << endl;return 0;}

8、vector swap()、assign()用法

利用swap()函数(交换两个vector)

vector<int> array{3, 5, 2, 6, 4};vector<int> outArray{1,2,3 };outArray.swap(array);//outArray={3,5,2,6,4};array={1,2,3}

利用assign()函数(清空并深复制)

vector<int> array{3, 5, 2, 6, 4};vector<int> outArray{1,2,3 };outArray.assign(array.begin(),array.end());//清空原数据,赋予新数据={3,5,2,6,4}outArray.assign(5, 0);//5个0,清空原数据={0,0,0,0,0,}

如果觉得《leetcode中使用c++需要注意的点以及各类容器的初始化 常用成员函数》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。