点我返回目录
2、string
我们在C语言中是如何定义一个字符串的呢?
最简单的就是char s[100]这样。然后读入和输出就是:
scanf("%s",s);
printf("%s",s);
现在,C++提供了一个string类型的模板,它的用处从英文的字面意思就可以了解,就是字符串类型。这个模板存在于头文件
#include<string>中
我们如何去用它呢?可以将string看成是int、char,来声明一个变量。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
return 0;
}
这样我们就声明了一个名叫s的string类型的变量。再来了解一下string类型的读入和输出,要先知道C++带有的新的读入、输出方式,cin和cout,从字面上也很好理解(一个in一个out)。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
cin>>s;
cout<<s;
return 0;
}
这样的代码,就完成了一个字符串的读入和输出。大家自己在电脑上试试效果吧,具体的输出图就不放出来了。
(经过尝试的同学可能已经意识到了上面读入字符串的方式是无法跳过一串字符中的空格的,读入一行的方法自己学习一下吧)
那么用string类型命名的变量有什么优势呢,我也不知道啊,毕竟我不识字。方便字符串的各种操作,如两个串的相加,还有串的删除什么的,具体看以下代码:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s1="I";
string s2="Love";
string s3="You";
string s="";
s+=s1;s+=s2;s+=s3;//操作1
cout<<s<<endl;
s1+=s2;s1+=s3; //操作2
cout<<s1<<endl;
return 0;
}
上面的两种操作方式都可以实现两个串的相加,相对于之前利用char来char去的是不是方便多了呢。
还有以下几个string自带的函数了解一下:
size()可以从字面理解,能得到字符串的长度。
//.size() 得到字符串的长度
cout<<"字符串的长度为:"<<s.size()<<endl;
得到size就可以方便我们做遍历或者一些其他的操作。比如这样:
for(int i=0;i<s.size();i++)
{
cout<<s[i];
}
find()可以从字面理解,能得到字符串中是否存在某些元素,返回的是下标。比如看个例子:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
s="abcdefghijk";
int pos=s.find("cde");
cout<<pos<<endl;
return 0;
}
上面的代码定义了一个串“abcdefghijk”,然后再从串中试图寻找另外一个串"cde",然后找到了返回了起始位置的下标2.记录在pos。如果找不到这样的串返回的值是string::npos或者说错误地理解为-1好了。
string还有好多有用的函数,等做题的时候大概会碰到吧。其实是懒得一个一个搜了。建议再了解一下比如.erase() .pop_back() .substring()。网上有很多介绍的!
2、vector
我的小伙伴一直在骚扰我维克托出门第一件到底带什么,主Q还是主E。
在C语言中,(我一般主R)我们用数组或者是链表的形式来储存连续的数据,而在C++中提供了vector的库函数,它自然应该在头文件#include<vector>中。可以将vector理解为动态数组。
我们直接来上手怎么操作吧。首先如果你需要开一个int类型的动态数组,那么就这样做:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int>vec;
return 0;
}
这样就声明了一个用来存放int类型元素的动态数组,他的名字是vec。同理的尖括号内可以被替换为任意类型,比如:char、double甚至是string。看图:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int>vec1;
vector<char>vec2;
vector<string>vec3;
vector<double>vec4;
return 0;
}
上面就是4中不同类型的维克托啦。
接着讲怎么往内部插入元素,vector最简单的插入方式就是push_back(x)。再看实例吧,口胡能力捕星。
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int>vec;
vec.push_back(2);
vec.push_back(421);
int x;
scanf("%d",&x);
vec.push_back(x);
return 0;
}
上面的代码就是在vec中先插入了一个数字2,再插入了一个数字421,甚至你可以int一个x在我们读入之后把它也压入vec中。
现在里面就存好了3个数啦。那么我们肯定是需要访问这里面有些啥的,vector提供了一个.size()来询问数组内元素的总数,那么利用这一点,我们就可以像访问一个正常的数组一样来访问维克托啦。
for(int i=0;i<vec.size();i++)
{
cout<<vec[i]<<endl;
}
是不是和数组几乎一模一样呢。
维克托还有.pop_back()用来弹出动态数组最后的元素,这个其实在函数的命名上来讲是很形象了。
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int>vec;
vec.push_back(2);
vec.push_back(421);
vec.pop_back();
for(int i=0;i<vec.size();i++)
{
cout<<vec[i]<<endl;
}
return 0;
}
上面的代码实现后就发现数字421被弹出,只会输出一个2啦。
维克托应该还有.insert()来在中间某个位置插入元素,这个也可以了解一下,但是感觉用的很少(可能是我题目写的太少)。还有一些奇奇怪怪的删除操作.erase()删除一段,用的也比较少叭(可能是我题目写的太少*2)。还推荐了解一下.back() .reserve() 。哎呀都懒得拉,因为感觉vector这个容器没这么多花里胡哨的(其实是不会)。