string用法

机器人的指令

数轴原点有一个机器人。该机器人将执行一系列指令,你的任务是预测所有指令执行完毕之后它的位置。

·LEFT:往左移动一个单位

·RIGHT: 往右移动一个单位

·SAME AS i: 和第i 条执行相同的动作。输入保证i 是一个正整数,且不超过之前执行指令数

Input

输入第一行为数据组数T (T<=100)。每组数据第一行为整数n (1<=n<=100),即指令条数。以下每行一条指令。指令按照输入顺序编号为1~n。

Output

对于每组数据,输出机器人的最终位置。每处理完一组数据,机器人应复位到数轴原点。

Sample Input
2
3
LEFT
RIGHT
SAME AS 2
5
LEFT
SAME AS 1
SAME AS 2
SAME AS 1
SAME AS 4
Sample Output
1
-5

#include<iostream>
#include<string>
using namespace std;
int main()
{
	int t;cin>>t;
	while(t--)
	{
		int n,x=0,m;
		string nouse;
		string str[100];
		cin>>n;
		for(int i=0;i<n;i++)
		{
			cin>>str[i];
			if(str[i]=="SAME")
			{
				cin>>nouse;
				cin>>m;
				//if(str[m-1]=="LEFT") str[i]="LEFT";
				//else str[i]="RIGHT";
				str[i]=str[m-1];
				//cout<<m<<endl;
			 }
			if(str[i]=="LEFT") x--;
			else if(str[i]=="RIGHT") x++;
		} 
		/*for(int i=0;i<n;i++)
		{
			cout<<str[i]<<endl;
		}*/
		cout<<x<<endl;
	}
	return 0;
}


 string的用法

定义和初始化string 对象

直接初始化和拷贝初始化

  • 直接初始化,利用小括号来完成,推荐使用,可以提高程序的效率
  • 拷贝初始化,利用等号的初始化,以后使用类或者结构体中尽可能写减少这个使用方法
  1. //定义和初始化string对象
  2. string s1; //定义以空字符,使用类中默认初始化
  3. string s2 = s1; //拷贝初始化,用s1赋值给s2
  4. string s3 = "Hello";//拷贝初始化,用字符串字面值初始化s3
  5. string s4(10, 'c'); //直接初始化,s4的内容是cccccccccc
  6. string s5(s3); //直接初始化,这是新的初始化方式,等价于s5 = s3
  7. string s6("World"); //直接初始化,这是新的初始化方式,等价于s6 = "World"

string 对象上的操作

 

读写string对象

  • 利用cin>> 来写入字符,是从第一个非空白字符开始,到一下一个空白结束
  • 如果想反复的读取字符的话可以利用while(cin<<),可以一直输入字符
    • 遇到非法输入会停止或者结束符
    • ctrl+d for unix/linux/ etc    
    • ctrl+z for windows/dos
  • 使用getline 来读取一整行

  1. string s1;
  2. cin >> s1; //输入第一个非空格,换行符,制表符等字符中,遇到空格就会停止。如" hello world"
  3. cout << s1 << endl; //显示的是 hello
  4. string s2, s3;
  5. cin >> s2 >> s3//输入"Hello world!"
  6. cout << s2 << s3 << endl;//输出 "Helloworld"
  1. string content;
  2. while (cin >> content)    //一直输入,知道遇到文件结束符
  3. {
  4. cout << content;
  5. }

string::size_type类型

  • size_type是一个无符号类型的值
  • string::size_type从本质上来说,是一个整型数。关键是由于机器的环境,它的长度有可能不同。
  • 添加这种类型是为了几种配套的类型,这样实现了使用的时候就与机器无关
  • 可以通过 auto 或者decltype 来推断string类中的size()类型
  • 在使用的过程中切记不要与带符号的数混用,如与int 类型混用
实例练习:
  1. 查看size_type类型的定义
  2. 练习auto 或者decltype的使用
  3. 练习size_type 与int 混用的后果
  1. //字符串的size_type类型
  2. string s1("abcdefgh");
  3. string::size_type t = s1.size();
  4. cout << "t = " << t << endl;
  5. auto at = s1.size();
  6. cout << "at = " << at << endl;
  7. decltype(at) x = 0;
  8. //注意这个是 size_type 是一个无符号的数,如果与负数混合使用会带来如下的错误
  9. if (< -1)
  10. {
  11. cout << "size is negative" << endl;
  12. }
  13. else
  14. {
  15. cout << "size is positive" << endl;
  16. }

比较string对象

  • 可以实现以下符合的比较 == ,!= ,<,<=,>,>= 
  • 区分大小写,规则如下
    • 根据长度不同时,如果对应位置字符相同时,较长的大于较短的
    • 如果对应位置不同时,直接比较第一个不同字符的结果
实例练习:
  1. "Hello", " Hello" "Hello world" "Hiya"
  1. //字符串的比较运算
  2. string s1("Hello");
  3. string s2("HelloWorld");
  4. string s3("Hiya");
  5. if (s1 > s2)
  6. {
  7. cout << "s1:Hello > s2:HelloWorld" << endl;
  8. }
  9. else
  10. {
  11. cout << "s1:Hello < s2:HelloWorld" << endl;
  12. }
  13. if (s1 > s3)
  14. {
  15. cout << "s1:Hello > s3:Hiya" << endl;
  16. }
  17. else
  18. {
  19. cout << "s1:Hello < s3:Hiya" << endl;
  20. }

两个对象string相加运算

  • 两个对象相加,相当于将加号前后的内容追加在一起
  • s1 += s2, 将s2的内容追加到s1上面

字面量与string对象相加

  • 切记需要在等号两侧都需要出现一个string对象!!!
  • 由于string 对象加上一个字面量,就相当于自动将字面量转换成string对象
  • 当字面量加上一个对象的时候,由于字符串字面量在前面,而其并不是标准类型的string 的对象,所以编译器不知道其实际的类型,会导致报错
实例练习:
  1. string a = " ,"+"hello"+s1等练习
  1. //字符串的相加运算
  2. string s1("abcd");
  3. string s2("efgh");
  4. s1 += s2;
  5. cout << s1 << endl;
  6. cout << s2 << endl;
  7. string s3 = s1 + "ijk";
  8. cout << s3 << endl;
  9. string s4 = "ijk" + s1;
  10. cout << s4 << endl;
  11. string s5 = "abc"+ "lmn" + s4; // abc 和 lmn 都是字面量,而不是字符串,编译器不知道其类型
  12. string s6 = s4 + "abc" + "lmn"; //s4 + "abc" 就会自动变成一个字符串,然后字符串再加上"lmn"
阅读更多
换一批

没有更多推荐了,返回首页