文章目录
字符串
1. to_string()
//int型 double型都适用
int num = 42;
string strNum = to_string(num);
2. stoi, stol, stof等
3.1 stoi
功能: 将字符串转换为 int 类型。
原型:
int stoi(const std::string& str, std::size_t* idx = nullptr, int base = 10);
参数:
str: 要转换的字符串。
idx: 指向未转换字符的索引(可选)。
base: 指定数字的进制(可选,默认为 10)。
3.2 stol
功能: 将字符串转换为 long 类型。
原型:
long stol(const std::string& str, std::size_t* idx = nullptr, int base = 10);
3.3 stoll
功能: 将字符串转换为 long long 类型。
原型:
long long stoll(const std::string& str, std::size_t* idx = nullptr, int base = 10);
3.4 stof
功能: 将字符串转换为 float 类型。
原型:
float stof(const std::string& str, std::size_t* idx = nullptr);
3.5 stod
功能: 将字符串转换为 double 类型。
原型:
double stod(const std::string& str, std::size_t* idx = nullptr);
3.6 stold
功能: 将字符串转换为 long double 类型。
原型:
long double stold(const std::string& str, std::size_t* idx = nullptr);
int main() {
string strInt = "12345";
string strFloat = "123.45";
string strLong = "1234567890123456789";
try {
int intVal = stoi(strInt);
float floatVal = stof(strFloat);
long longVal = stol(strLong);
double doubleVal = stod("3.14159");
cout << "Integer: " << intVal << endl;
cout << "Float: " << floatVal << endl;
cout << "Long: " << longVal << endl;
cout << "Double: " << doubleVal << endl;
} catch (const invalid_argument& e) {
cerr << "Invalid argument: " << e.what() << endl;
} catch (const out_of_range& e) {
cerr << "Out of range: " << e.what() << endl;
}
return 0;
}
容器操作(STL基本都行)
1. back() 和 front()
v.back()
: 获取容器的最后一个元素。
v.front()
: 获取容器的第一个元素
2. rbegin() 和 rend()
作用:返回指向最后一个元素和尾后元素的逆向迭代器。
用法:
auto rit = myset.rbegin()
获取最后一个元素的逆向迭代器。
3.emplace() 和 emplace_back()
emplace 和 emplace_back 是 C++ 标准库中的两个强大函数,它们都用于在可容纳对象的容器中直接构造对象,避免不必要的复制或移动。
emplace_back
适用于vector,deque,list
等序列容器
emplace
适用于几乎所有容器:vector map queue priority_queue set
等
vector<int> v;
v.emplace(v.begin(),1);
v.emplace_back(1);
//优先队列 默认大根堆 greater<>小根堆
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<>> pq;
pq.push(make_pair(0,k));
pq.emplace(0, k);
priority_queue<tuple<int, int, int>,vector<tuple<int,int,int>>,greater<>> pq;
pq.emplace(0, s, k);
class MyClass {
public:
MyClass(int x) : val(x) {
cout << "MyClass constructed with value: " << val << endl;
}
private:
int val;
};
int main() {
map<int, MyClass> myMap;
myMap.emplace(1, 10); // 在 map 中插入一个键值对,其中值是 MyClass 对象
return 0;
}
4. insert()
string s = "abc";
s.insert(0,2,'b');//在0位置插入2个字符a => bbabc
s.insert(3,1,'a');//在末尾插入1个字符a => abca
//或者
s.insert(s.size(),1,'a');
5. fill()
用特定值填充容器
vector<int> vec = {1, 2, 3, 4, 5};
// 填充 vector 的前 3 个元素为 0
fill(vec.begin(), vec.begin() + 3, 0);
//或者
ranges::fill(vec, 0);
6. count()
计算特定值在容器中出现的次数
vector<int> vec = {1, 2, 3, 2, 4, 2, 5};
// 计算值 2 在 vec 中出现的次数
int count = count(vec.begin(), vec.end(), 2);
//或者
ranges::count(vec, 2);
7. copy()
复制元素
copy(newstr, newstr + size, temp);
- 第一个参数是源的起始位置,即要复制元素的起始地址。
- 第二个参数是源的结束位置,即要复制元素的结束地址的下一个位置。
- 第三个参数是目标的起始位置,即复制后元要存放的位置。
示例:
vector<int> a = {1,2,3};
vector<int> b(20,0);
copy(a.begin(),a.end(),b.begin());
算法库函数
1. sort()
sort(v.begin(),v.end(),[](const auto& a,const auto& b){
return a[1] < b[1]; //从小到大排序
});
自定义比较函数
bool customCompare(const int& a, const int& b) {
// 比较规则:按照绝对值从大到小排序
return abs(a) > abs(b);
}
int main() {
vector<int> nums = {3, -1, 4, -2, 5, -9, 2, 6};
// 使用自定义比较函数进行排序
sort(nums.begin(), nums.end(), customCompare);
// 使用 Lambda 表达式进行排序(按照绝对值从大到小排序)
sort(nums.begin(), nums.end(), [](const int& a, const int& b) {
return abs(a) > abs(b);
});
return 0;
}
2. reverse()
反转容器中的元素顺序
reverse(s.begin(), s.begin() + i )
常用于 数组
vector string deque
int main() {
vector<int> vec = {1, 2, 3, 4, 5};
// 打印原始向量
cout << "Original vector: ";
for (int n : vec) {
std::cout << n << " ";
}
cout << std::endl;
// 反转向量
reverse(vec.begin(), vec.end());
// 打印反转后的向量
cout << "Reversed vector: ";
for (int n : vec) {
std::cout << n << " ";
}
cout << std::endl;
return 0;
}
3. find() , find_if() 和 find_if_not()
find()
: 查找特定值
find_if()
: 查找符合特定条件的第一个元素
find_if_not()
: 查找不符合特定条件的第一个元素
vector<int> v = {1, 2, 3, 4, 5};
//find_if 在范围内查找第一个偶数
auto it = find_if(v.begin(), v.end(), [](int x) { return x % 2 == 0; });
//find_if_not 在范围内查找第一个不是偶数
auto it = find_if_not(v.begin(), v.end(), [](int x) { return x % 2 == 0; });
if (it != v.end()) {
cout << "Found the first even number: " << *it << endl;
} else {
cout << "No even number found!" << endl;
}
//find
vector<int> v = { 1,2,3 };
int it = find(v.begin(),v.end(),2)-v.begin();
cout << v[it] << endl;
//string find
string s1 = "abc";
int it = s1.find("bc");
4. replace()
替换容器中符合条件的元素
str.replace(pos, len, str)
string str("The quick brown fox jumps over the lazy dog.");
// brown替换为fox
str.replace(10, 5, "red");
//将The替换为2个A
str.replace(str.begin(), str.begin() + 3, 2, 'A');
5. for_each()
对容器中的每个元素执行函数
vector<int> v = { 1, 2, 3, 4, 5 };
//每个数进行平方
for_each(v.begin(), v.end(), [](int& a) {
a *= a;
});
//打印每个数
for_each(v.begin(), v.end(), [](int a) {
cout << a << " ";
});
6. transform
用于对指定范围内的元素进行操作并将结果存储到另一个范围。
示例 1:使用单一操作(输入范围到输出范围)
int main() {
vector<int> vec = {1, 2, 3, 4, 5};
vector<int> squared(vec.size());
// 使用 transform 将 vec 中的每个元素平方并输出到 squared
transform(vec.begin(), vec.end(), squared.begin(), [](int x) { return x * x; });
return 0;
}
示例 2:两个输入范围到一个输出范围
int main() {
vector<int> vec1 = {1, 2, 3};
vector<int> vec2 = {4, 5, 6};
vector<int> sum(vec1.size());
// 使用 transform 将 vec1 和 vec2 中的元素相加并输出到 sum
transform(vec1.begin(), vec1.end(), vec2.begin(), sum.begin(), [](int x, int y) { return x + y; });
return 0;
}
7. equal()
比较两个范围的元素是否相等
int main() {
int arr1[] = {1, 2, 3, 4, 5};
int arr2[] = {1, 2, 3, 4, 5};
bool result = equal(begin(arr1), end(arr1), begin(arr2));
if (result) {
cout << "两数组相等" << std::endl;
} else {
cout << "两数组不相等" << std::endl;
}
return 0;
}
bool custom_compare(int a, int b) {
return a % 2 == b % 2; // 只比较奇偶性
}
int main() {
vector<int> vec1 = {1, 2, 3, 4, 5};
vector<int> vec2 = {1, 3, 5, 7, 9};
if (equal(vec1.begin(), vec1.end(), vec2.begin(), custom_compare)) {
cout << "两容器有相同的奇偶性" << endl;
} else {
cout << "两容器没有相同的奇偶性" << endl;
}
return 0;
}
8. accumulate()
对范围内的元素进行累加
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
int sum = accumulate(numbers.begin(), numbers.end(), 0);//0: init
cout << "累加和为: " << sum << std::endl;
int p=1e9+7;
return accumulate(dp.begin()+low,dp.begin()+high+1,0,[p](int sum,int cur){
return sum = (sum + cur) % p;
});
return 0;
}
9. max_element , min_element, minmax_element和minmax
与max不同,max返回最大值的引用,而max_element返回的是地址
max也可以同时比较多个元素
bool customCompare(const int& a, const int& b) {
return abs(a) < abs(b);//绝对值从小到大,返回最后则是最大
}
int main() {
int arr[] = {5, 8, 3, 9, 2};
int n = sizeof(arr) / sizeof(arr[0]);
//max也可以比较多个
int max_ = max({5,8,3,9,2});
// 使用 max_element 求取数组中的最大值
int max_val = *max_element(arr, arr + n);
//自定义比较函数
auto max_it = max_element(nums.begin(), nums.end(), customCompare);
cout << "最大值为: " << *max_it << endl;
//min_element同理
//minmax_element
vector<int> b = {1,3,4,2,6};
auto res = minmax_element(b.begin(),b.end());
cout << *res.first << " " << *res.second;
//minmax比较两个值
auto ress = minmax(b[0],b[3]);
cout << ress.first << " " << ress.second;
return 0;
}
10. nth_element()
对元素进行部分排序,找到第 N 个元素的位置
vector<int> v{ 5, 6, 4, 3, 2, 6, 7, 9, 3 };
nth_element(v.begin(), v.begin() + v.size() / 2, v.end());
cout << "中位数是 " << v[v.size() / 2] << '\n';
nth_element(v.begin(), v.begin() + 1, v.end(), greater<int>());
cout << "第二大的数为" << v[1] << '\n';
11. partial_sum()
计算部分前缀和
int main() {
vector<int> input = {1, 2, 3, 4, 5};
vector<int> output(input.size());
partial_sum(input.begin(), input.end(), output.begin());
// 输出结果
for (const auto& num : output) {
std::cout << num << " ";
}
cout << std::endl;
//output
//1 3 6 10 15
return 0;
}
12. iota()
用连续的递增值填充范围
int main() {
vector<int> vec(10); // 创建一个大小为10的整数向量
// 使用 std::iota 填充 vec,初始值从1开始
iota(vec.begin(), vec.end(), 1);//1 2 3 4 5 6 7 8 9 10
return 0;
}
13. upper_bound() 和 lower_bound()
upper_bound()
: 查找第一个大于特定值的元素位置
lower_bound()
: 查找第一个不小于特定值的元素位置
注意: 返回的是地址指针
int main() {
vector<int> vec = {1, 2, 4, 5, 6, 8, 10}; // 已排序的向量
int value = 5;
// 查找第一个不小于 5 的元素
auto it = lower_bound(vec.begin(), vec.end(), value);
//upper_bound同理
// 输出结果
if (it != vec.end()) {
cout << "第一个不小于" << value << "的是" << *it << "位置为:" << (it - vec.begin()) << endl;
} else {
cout << "所以的数都小于" << value << endl;
}
return 0;
}
pair结构体和元组
1. pair<>
//定义
pair<int, string> myPair = make_pair(10, "hello");
//pair在vector中的使用
vector<pair<int, string>> vec;
vec.push_back(make_pair(1, "apple"));
//pair在map中的使用
map<int, pair<int, string>> myMap;
myMap[1] = make_pair(10, "banana");
2. tuple<>
tuple是类似于pair的模板,不同之处在于pair是两个成员,而tuple可以任意数量的成员。
//定义
tuple<int, int, int> threeI{1,2,3};
//获取
auto book = get<0>(threeI); //返回threeI的第一个成员
auto price = get<1>(threeI); //返回threeI的第二个成员
auto haha = get<2>(threeI); //返回threeI的第三个成员
结束语
以上内容总结均来自C++帮助文档,若有误,欢迎留言指正!!!
C&C帮助文档
整理不易,请各位看官点赞,收藏加关注~~~