笔者两年前用的C++,后来发现python这种神器,用的python较多,且用于刷leetcode,现在因为工作原因重新拿起了C++,话说两年前立志要把那本C++primer看完的决心又可以启程了,废话不多说,以下是刷leetcode时,用到C++的一些库函数,也是基础,是自己的笔记,但也是刷题必备呀有木有,简直如虎添翼,不然跟C有啥区别的。
#include
std::vector<int> newList;
std::vector<int> newList={1,2,3};
std::vector<int> newList(1,2);
二维数组
vector<vector<int>> newVec(rowNum, vector<int>(columnsNum, 0))
https://blog.csdn.net/yjunyu/article/details/77728410
//在b开始位置处插入6个6
b.insert(b.begin(), 6, 6);
std::vector<int>test3;
test3.reserve(2); # 预设两个位置
test3.resize(2,1); # 在test3的前两个位置赋值-2个1,如果有值则不赋
https://blog.csdn.net/u013654125/article/details/77321081
vector<int> iVec;
for (auto it = iVec.begin(); it != iVec.end();) {
if (*it % 3 == 0)
it = iVec.erase(it); //删除元素,返回值指向已删除元素的下一个位置
else
++it; //指向下一个位置
}
https://blog.csdn.net/qxconverse/article/details/67638545
#include
#include
#include
using namespace std;
int main(){
vector<int> a = { 2,4,6,7,1,0,8,9,6,3,2 };
auto maxPosition = max_element(a.begin(), a.end());
cout << *maxPosition << " at the postion of " << maxPosition - a.begin() <<endl;
//cout << a[maxPosition - a.begin()] << " at the postion of " << distance(a.begin(), maxPosition) << endl;
system("pause");
return 0;
}
int sumOfTheVector=accumulate(thisIsVector.begin(),thisIsVector.end(),0);
advance
进行后移操作; vector<int> vec;
vec.push_back(4);
vec.push_back(6);
auto pos = vec.begin();
advance(pos, 1);
vec.insert(pos, 7); // 也可以是 vec.insert(vec.begin() + 1, 7)
for (auto i : vec) {
cout << i << endl;
}
注意:位置的迭代器的初始要跟插入的vector一致。
std::vector<int> src;
std::vector<int> dest;
dest.insert(dest.end(), src.begin(), src.end());
vector<int> vec1 = {0, 2, 1, 1};
sort(vec1.begin(), vec1.end());
auto end_unique = unique(vec1.begin(), vec1.end());
注:这里“删掉”打引号,因为这不是真正的删除,而是把vec1中的重复的值放在vector的最后面(位置未知),vec1即为操作后的vector,而返回值即为最后一个不重复元素之后的位置。
https://blog.csdn.net/zhang14916/article/details/100859487
类似与python的set集合,有find的方法,另外有个特性就是里面的元素没有重复的。
#include
std::unordered_set<std::string> c{"aaa"};
a.find(“eeee”):查找元素"eeee",返回结果为a.end()则表明没有找到,否则返回所对应元素。
unordered_set<int> set;
for (int i = 0; i < 10; i++) {
set.insert(set[i]);
}
for (unordered_set<int>::iterator i = set.begin(); i != set.end(); i++) {
cout << *i << endl;
}
cout << " find 3: " << *set.find(3) << endl;
cout << "count 5:" << set.count(5) << endl;
unordered_set<int> set;
for (int i = 0; i < 10; i++) {
set.insert(set[i]);
}
for (auto &s : set) {
cout << s << endl;
}
pair<int, int> # 声明的时候
make_pair(0, 0) # 构造pair数对
auto result = make_pair(0, 0) # 数对构造后存入auto类型的变量中
bool Solution::isPathCrossing(string path) {
set<pair<int, int>> temp;
temp.insert(make_pair(0, 0));
int x = 0;
int y = 0;
for (auto &d : path) {
switch (d) {
case 'N':
y += 1;
break;
case 'E':
x += 1;
break;
case 'S':
y -= 1;
break;
case 'W':
x -= 1;
break;
}
auto newLocation = make_pair(x, y);
if (temp.count(newLocation)) {
return true;
}
temp.insert(newLocation);
}
return false;
}
vector<string> wordList;
unordered_set<string> dict(wordList.begin(), wordList.end());
https://blog.csdn.net/u012604810/article/details/79798082
https://leetcode-cn.com/problems/subarray-sums-divisible-by-k/solution/he-ke-bei-k-zheng-chu-de-zi-shu-zu-by-leetcode-sol
#include
unordered_map<int, int> record = {{0, 1}};
iterator find ( const key_type& key );
如果key存在,则find返回key对应的迭代器,如果key不存在,则find返回unordered_map::end。因此可以通过
map.find(key) == map.end()来判断,key是否存在于当前的unordered_map中。
⚠️注意:如果key为结构体,要查找的话,必须要key变为指针。
size_type count ( const key_type& key ) const
count函数用以统计key值在unordered_map中出现的次数。实际上,c++ unordered_map不允许有重复的key。因此,如果key存在,则count返回1,如果不存在,则count返回0.
unordered_map<int, int> map1;
map1.insert({1, 3});
int res = map1[1];
auto temp = map1.find(1);
int res = temp.second;
https://blog.csdn.net/liqinzhe11/article/details/79278235
定义成这样即可:
map<int, int, greater<int>> mp1; // 降序
map<int, int, less<int>> mp2; // 升序
int oldPrice = timePriceMap[timestamp];
priceCntMap[oldPrice]--;
if (priceCntMap[oldPrice] == 0) {
priceCntMap.erase(oldPrice);
}
https://blog.csdn.net/qian2213762498/article/details/79250097
https://blog.csdn.net/wallwind/article/details/6827863
#include
string s(1, '2');
s.find(‘a’) 字符串 s查询’a’字符或字符串 返回所在的位置
s.find(‘a’, n) 字符串s从n下标开始查询’a’字符或字符串 返回所在的位置
如果找不到返回 string::npos(-1)
String.substr(first_idx, nums) # 从first_idx索引开始nums个字符
std::cout<<std::to_string(3)<<"\n";
std::cout<<std::stoi("123")<<"\n";
同时有:stol(long), stof(float), stod(double)
std::cout<<"======string====="<<"\n";
std::string str("asgdasfd");
std::string s(str.rbegin(),str.rend());
std::cout<<s<<"\n";
std::string str("asgdasfd");
reverse(str.rbegin(),str.rend());
std::cout << str << "\n";
#include
#include
#include
#include
using namespace std;
void split(const string& s,vector<int>& sv,const char flag = ' ') {
sv.clear();
stringstream iss(s);
string curr;
while (getline(iss, curr, flag)) {
if(curr.size() > 0){
sv.push_back(stoi(curr));
}
}
return;
}
int main() {
string s("123:456:7");
vector<int> sv;
split(s, sv, ':');
for (const auto& s : sv) {
cout << s << endl;
}
system("pause");
return 0;
}
#include
#include
std::cout << "====stack=====" << "\n";
std::stack<int> test;
test.push(2);
test.push(5);
test.push(4);
int sdfdf = test.top();
std::cout << test.top() << "\n";
std::cout << "====queue=====" << "\n";
std::queue<int> t;
t.push(1);
std::cout << t.front() << "\n";
std::cout << t.back() << "\n";
注:均不可遍历、不可赋值初始化
个人感觉比较无敌,可以赋值初始化,遍历,两边可进,可出。
std::cout << "========deque==========" << "\n";
std::deque<int> testD(6,3);
for (int i = 0; i < testD.size(); i++){
std::cout << testD[i] << " ";
}
(栗子待补)
https://blog.csdn.net/weixin_36888577/article/details/79937886
算法题中,当要频繁求一个数据结构中的最大值时,要想到用优先队列。
top 访问队头元素
empty 队列是否为空
size 返回队列内元素个数
push 插入元素到队尾 (并排序)
emplace 原地构造一个元素并插入队列
pop 弹出队头元素
swap 交换内容
- 移除石子使总数最小
https://blog.csdn.net/w_linux/article/details/76222112
#include
#include
boolmyfunction2(int i, int j)
{ return (i > j); }//降序排列
int main(){
int a[20] = {2, 4, 1, 23, 5, 76, 0, 43, 24, 65}, i;
for (i = 0; i < 20; i++)
cout << a[i] << endl;
sort(a, a + 20);
for (i = 0; i < 20; i++)
cout << a[i] << endl;
std::vector<int> a = {2, 4, 1, 23, 5, 76, 0, 43, 24, 65};
int i;
for (i = 0; i < 10; i++)
std::cout << a[i] << std::endl;
# std::sort(a.begin(), a.end()); 默认两个参数升序排序
std::sort(a.begin(), a.end(), myfunction2);
for (i = 0; i < 10; i++)
std::cout << a[i] << std::endl;
return 0;
}
vector<int> vector1 = {1,2,3,4,5,6};
sort(vector1.begin(), vector1.end(), greater<int>());// 降序
sort(vector1.begin(), vector1.end(), less<int>());// 升序
sort(people.begin(), people.end(), [=](const vector<int> &p1, const vector<int> &p2) {
return p1[0] > p2[0] || (p1[0] == p2[0] && p1[1] < p2[1]);
});
vector<int> vT = {1,2,8,3};
vector<int> vecIdx(vT.begin(), vT.end());
std::iota(vecIdx.begin(), vecIdx.end(), 0);
sort(vecIdx.begin(), vecIdx.end(), [&vT](const int &index1, const int &index2) {
return vT[index1] > vT[index2];
});
for (auto i : vecIdx) {
cout << i << " ";
}
// 2 3 1 0
求数组的max和min的时候都需要假设初始值为正无穷或者负无穷,当然也可以随意从数组中取一个值作为初始值,通常取第一个。
在c++中怎么表示正无穷和负无穷呢?
如果是int,可以用INT_MAX表示正无穷,INT_MIN表示负无穷,需要包含limits.h。
如果是double,可以用DBL_MAX表示正无穷,-DBL_MAX表示负无穷(注意不是DBL_MIN),需要包含float.h。
http://blog.csdn.net/caroline_wendy/article/details/24311895
头文件: #include
std::max(a, b)
std::min(a, b)
只能比较两个元素
需要注意:
对于C++,幂运算最好预先算出,避免超过数据类型预设的容量。
如:
vector<long long> pow1(nums.size() + 2);
pow1[0] = 1;
for (int i = 1; i < nums.size(); i++) {
pow1[i] = pow1[i - 1] * 2 % mod;
}
#typedef long long ll;
using ll = long long;
const ll maxValue = 1e9 + 7;
结点的复制是引用,对复制后的那个结点操作也是对复制前的结点操作。
set<int> set2 = {1,2};
auto f = set2.find(1);
if (f != set2.end()) {
cout << "f ok " << endl;
}
set2.erase(f);
for (auto item : set2) {
cout << item << endl;
}
string hello = "asdfgdg";
auto f5 = hello.find('h');
if (f5 == -1) {
cout << "yes" << endl;
}
vector<int> vec1 = {1,2,3,4,5};
auto fi = find(vec1.begin(), vec1.end(), 1);
if (fi != vec1.end()) {
cout << "find 1" << endl;
}