由于前段时间做一些算法题目时发现C++一些基本的标准库还是挺有用的,但是我对一些库还不是太了解,所以最近准备开一个新的专题,记录一些C++基本的语法以及有用的库函数。
这篇博客也会不定期更新。
直接上干货:
目录
Vector库
定义
定义一维vector数组:
vector<typename> name;
//例子
vector<int> name;
vector<double> name;
vector<char> name;
定义二维vector数组:
//第一种写法
vector<int> name[100];
//第二种写法
vector<vector <int>> name;
元素访问
1.通过下标访问
for (int i = 0; i < name.size(); i++)
{
cout << name[i];
}
2.通过迭代器访问
//迭代器访问
//迭代器it指向name的首地址
vector<int> ::iterator it = name.begin();
for (int i = 0; i < name.size(); i++)
{
cout << *(it + i) << ' ';
}
begin() 和end()函数:
begin()是取vector的首元素地址,但是end()则不是取尾元素地址,而是取尾元素地址的下一个地址。end()作为迭代器的末尾标志,不储存任何元素。
尾部地址遍历:
for (vector<int>::iterator it = name.begin(); it != name.end(); it++) {
cout << *it << ' ';
}
vector常用函数
push_back()
push_back(x)在vector尾部添加一个元素x
//动态添加元素
for (int i = 0; i < 10; i++) name.push_back(i);
pop_back()
pop_back()用以删除vector的尾元素
//尾部删除元素
name.pop_back()
size()
size()用来获得vector中元素的个数
一般用法:
for (int i = 0; i < name.size(); i++)
{
cout << name[i] << ' ';
}
insert()
insert(it, x) 用来向vector的任意迭代器it处插入一个元素x
//任意位置插入元素
//在name[1]的位置插入2
name.insert(name.begin()+1, 2);
erase()
erase()有两种用法:删除单个元素、删除一个区间内的所有元素。
1.删除单个元素:erase(it) 即删除迭代器为it 处的元素
//0123456789
for (int i = 0; i < 10; i++) name.push_back(i);
//删除任意位置的元素
//这里删除的是name[2]处的元素,也就是2
name.erase(name.begin() + 2);
for (auto i:name) cout << i;
cout << endl;
2.删除一个区间内的所有元素,erase(first, last), 即删除[first, last)内的所有元素,注意,不包括last
for (int i = 0; i < 10; i++) name.push_back(i);
//删除任意位置的元素
//删除的是name[1]、name[2]处的元素
name.erase(name.begin() + 1,name.begin()+3);
for (auto i : name) cout << i;
cout << endl;
要想删除所有元素可以使用erase(name.begin(),name.end())或者name.clear()
for (int i = 0; i < 10; i++) name.push_back(i);
//删除任意位置的元素
name.erase(name.begin(), name.end());
//name.clear();
for (auto i : name) cout << i;
cout << endl;
set()库
添加头文件:#include<set>
定义
定义set():
set<int> name;
set<double> name;
set<char> name;
定义set()数组:
这样a[0] ~ a[99] 中的每一个都是一个set容器。
set<int> a[100];
访问set元素
set只能通过迭代器(iterator)访问
除了vector 和 string 之外的STL容器都不支持*(it + i) 的访问方式
//访问set元素
for (set<int>::iterator it = st.begin(); it != st.end(); it++) {
cout << *it << ' ';
}
set常用函数
insert()
insert(x),将x插入set容器中,并自动递增排序和去重,注意insert()和vector中用法的不同。
for (int i = 0; i < 10; i++)
{
st.insert(i);
}
find()
find(value), 返回set中对应值为value的迭代器。
cout << *(st.find(20));
erase()
erase()有两种用法:删除单个元素、删除一个区间内的所有元素
1.删除单个元素:删除单个元素也有两种方法
方法一:st.erase(it), it为所需要删除元素的迭代器。结合find()函数来使用。
//删除元素
//用find方法找到2然后删除它
st.erase(st.find(2));
方法二:st.erase(value), value为所需要删除元素的值。
//直接删除2
st.erase(2);
2.删除一个区间内的所有元素:st.erase(first, last)可以删除一个区间内的所有元素,其中first为所需要删除区间的起始迭代器,而last则为所需要删除区间的末尾迭代器的下一个地址,即为删除[first, last),注意,不包括last。
// 删除一个区间
// 删除的是2,3,4
st.erase(st.find(2), st.find(5));
for (set<int>::iterator it = st.begin(); it != st.end(); it++) {
cout << *it << ' ';
}
删除全部元素
//删除全部元素
st.erase(st.begin(), st.end());
for (set<int>::iterator it = st.begin(); it != st.end(); it++) {
cout << *it << ' ';
}
size()
size()用来获得set内的元素个数
//set的尺寸
cout << st.size();
clear()
clear()用来清空set中的所有元素
//删除全部元素
st.clear();
for (set<int>::iterator it = st.begin(); it != st.end(); it++) {
cout << *it << ' ';
}
math.h库
引用
#include<math.h>
常用函数
fabs(double x)
该函数用于对double 型变量取绝对值。
int a = -2;
// 输出2
cout<< fabs(a);
pow(double r,double p)
该函数用于返回 r ^ p ,要求r 和 p 都是double类型
//开方
double a = 3;
double b = 4;
cout<< pow(3, 4);
sqrt(double x)
该函数用于返回double型变量的算数平方根
string.h库
引用
#include<string.h>
strlen()
strlen()函数可以得到字符数组中第一个\0之前的字符的个数
char a[] = "abcd";
cout<< strlen(a);
strcmp()
strcmp()函数返回两个字符串大小的比较结果,比较原则是按字典序,所谓字典序就是字符串在字典中的顺序,因此如果有两个字符数组str 1 和 str 2, 且满足str 1[0...k - 1] == str 2[0...k - 1]、str1[k] < str2[k], 那么就说str 1的字典序小于str2。例如"a" 的字典序小于"b"、"aaaa" 的字典序小于"aab"
strcmp()函数的返回值:
- 如果字符数组1 < 字符数组2,则返回一个负整数(不一定是-1,由编译器决定)
- 如果字符数组1 == 字符数组2,则返回0
- 如果字符数组1 > 字符数组2,则返回一个正整数(不一定是1,由编译器决定)
char s1[] = "abcd";
char s2[] = "abce";
cout<< strcmp(s1, s2);
strcpy()
strcpy()函数可以把一个字符串复制给另一个字符串
strcpy(字符数组1,字符数组2);
把字符数组2复制给字符数组1
“复制” 也包括了结束标志\0
char s1[50] = "jdsaiosdi";
char s2[50] = "fjwio;ahf;ndilafcnads;ojcsda;c";
//微软担心会溢出所以改写了函数
cout<< strcpy_s(s1,s2);
cout << s1;
strcat()
strcat()可以把一个字符串拼接到另一个字符串的后面
strcat(字符数组1, 字符数组2);
把字符数组2拼接到字符数组1的后面
//字符串拼接
char s1[50] = "jdsaiosdi";
char s2[50] = "fjwio;ahf;ndilafcnads;ojcsda;c";
//微软担心会溢出所以改写了函数
strcat_s(s1, s2);
cout << s1;
string类型
定义
string str;
string类型的访问
1.通过下标访问
for (int i = 0; i < ss.length(); i++)
{
cout << ss[i];
}
2.通过迭代器访问
//迭代器访问
for (string::iterator it=ss.begin();it!=ss.end();it++)
{
cout << *it << ' ';
}
string转为字符数组
c_str()
//string转为字符数组
string ss = "abcde";
char a[50];
strcpy_s(a, ss.c_str());
strlen(ss.c_str());
cout << a <<endl;
字符数组转为string
//字符数组转为string
string s1 = a;
cout << s1 << endl;
string常用函数
operator+=
这是string的加法,可以将两个string直接拼接起来
compare operator(比较操作符)
两个string类型可以直接使用==、!=、<、<=、>、>=比较大小,比较规则是字典序。
length() / size()
length()返回string的长度,即存放的字符数。size()与length()基本相同。
insert()
tring的insert()函数有很多种写法,这里给出几种常用的写法:
1.insert(pos, string), 在pos号位置插入一个字符串string
string ss = "abcde";
ss.insert(2, "fsj");
2.insert(it, it2, it3), it 为原字符串的欲插入位置,it2 和 it3 为待插字符串的首尾迭代器,用来表示串[it2, it3)将被插在it 的位置上。
string s1 = "abcde";
string s2 = "fsjfsjfsj";
s1.insert(s1.begin() + 3, s2.begin() + 2, s2.begin() + 6);
cout << s1;
erase()
erase()有两种用法:删除单个元素、删除一个区间内的所有元素。
1.删除单个元素:str.erase(it) 用于删除单个元素,it为需要删除的元素的迭代器
string s1 = "abcde";
s1.erase(s1.begin()+2);
cout << s1;
2.删除一个区间内的所有元素:有两种方法:
- str.erase(first, last), 其中first为需要删除的区间的起始迭代器,而last为需要删除的区间的末尾迭代器的下一个地址,即为删除[first, last)
- str.erase(pos, length), 其中pos为需要开始删除的起始位置,length为删除的字符个数。
string s1 = "abcdeabcde";
//方法1:
s1.erase(s1.begin() + 2, s1.begin() + 5);
cout << s1;
//方法2:
s1.erase(2, 3);
cout << s1;
clear()
clear()可以清空string中的数据
substr()
substr(pos, len) 返回从pos号位开始、长度为len的子串。
string s1 = "abcdeabcde";
string s2 = s1.substr(2, 3);
cout<< s2;
find()
str.find(str2) 当str2 是str 的子串时,返回其在str 中第一次出现的位置,如果str2 不是str 的子串,那么返回string::npos。
str.find(str2, pos), 从str 的pos 号位开始匹配str2,返回值与上相同。时间复杂度为O(M*N),M和N 分别是str2 和str的长度。
string s1 = "abcdeabcde";
string s2 = "deabc";
if (s1.find("de")!=string::npos)
{
cout << s1.find("de") << endl;
}
if (s1.find(s2,2)!=string::npos)
{
cout << s1.find(s2, 2) << endl;
}
else
{
cout << "未找到对应的串匹配" << endl;
}
replace()
str.replace(pos,len,str2) 把str 从pos 号位开始、长度为len 的子串替换为上str2
str.replace(it1,it2,str2) 把str 的迭代器[it1, it2)范围的子串替换为str2
string s1 = "abcdeabcde";
string s2 = "123";
//方法1:
s1.replace(2, 5, s2);
cout << s1;
//方法2
s1.replace(s1.begin() + 2, s1.begin() + 5, s2);
cout << s1;