string、 vector

STL

STL容器是多线程时是不安全的;std…sort不是稳定排序,底层:插入排序+快速排序,排序的稳定与否是针对重复数据而言,排序前后对于重复数据的相对顺序未变化:稳定;std::bitset不是—个STL客器,不装某种类型,装2进制位;

1级容器:数据类型不能是组合类型:vector<int>、vector<vector<int>>
组合类型:key-value值对结构组合map<int,string>

vector

vector<pair<int,int>>用法:vector的这种用法有点类似于map。
与map不同的是:map会对插入的元素按键自动排序,而且不允许键重复。
vector的这种用法不会自动排序,而且允许重复。
往vector中插入数据,需要用到make_pair:vec.push_back(make_pair(20,30));
vec.emplace_back(2,2);

看STL源代码:看大框架,不看细枝末节
类模板声明、定义要分离也都放在同一个文件,声明、定义分离原因:有利于看到类的整体框架,
在这里插入图片描述

struct Point{
int x;int y;}
void test(){
list<Point> lt;
lt.push_back( {12});
list<Point> : :iterator it = lt.begin() ;
while (it != lt.end())
{
//cout <<*it<< endl;错误,没用重载Point(自定义)类型的输出输入
cout <<(*it).x << ":"<<(*it).y << endl;//方法1
cout << it->x <<:<< it->y <<endl; //方法2.->代表解引用
++it;}
cout << endl;}
//结果:1:2
//(*it):Point对象

string

string operator+=(char ch)//无引用,方法1,自定义类型不使用引用会引发深拷贝,深拷贝对象越大,代价越大
		{			push_back(ch);
			return *this;
		}
string& operator+=(char ch)//方法2,有引用
		{
			push_back(ch);
			return *this;
		}
		void append(const char* str)
		{
			size_t len = strlen(str);
			if (_size+len > _capacity)
			{
				reserve(_size + len);
			}
			strcpy(_str + _size, str);
			_size += len;
		}
string& operator+=(const char* str)
		{
			append(str);
			return *this;
		}
string& operator+=(const string& s)
		{
			append(s._str);
			return *this;
		}
string str;//string中可以存储多个\0字符
str. push_back('a') ;
str.push_back('\0') ;
str. push_back('\0');
cout<<str<<endl ;//a
cout<<str.size()<<end1;//3

MP3光标位置

num: 在当前这1页,光标所处的位置,所在页的起始位置的编号
第1个u时:num在:10, first在7;第2个u时:num在:9, first在7;……
//将n首歌进行编号,从1开始, n,其中num代表当前光标所在的歌曲编号,first代表当前页的第一首歌曲的编号

#include<iostream>
#include<string>
using  namespace std;
int main()
{
	int n;
	string cmd;
	while (cin >> n >> cmd)
	{
		int num = 1, first = 1;
		if (n <= 4)
		{
			//歌曲总数<=4
			for (int i = 0; i < cmd.size(); ++i)
			{//解析命令
				 if(num == 1 && cmd[i] == 'U')
				num = n;
			else if (num == n && cmd[i] =='D')
				num = 1;
			else if (cmd[i] == 'U')
				num--;
			else
				num++;
			}
		for (int i = 1; i <= n; ++i)
		  cout << i << " ";
		cout << endl;//换行
		cout << num << endl;
	}
else
{//歌曲总数>4
	for (int i = 0; i < cmd.size(); ++i)
	{		//解析命令
		if (first == 1 && num == 1 && cmd[i] == 'U')
		{
			first = n - 3; //将first跳入最后一页
			num = n;
		}
		else if (first == n - 3 && num == n && cmd[i] == 'D')
		{
			first = num = 1;
		}
		else if (first != 1 && num == first && cmd[i] == 'U')
		{
			first--;
			num--;
		}
		else if (first != n - 3 && num == first + 3 && cmd[i] == 'D')
		{
			first++;
			num++;
		}
		else if (cmd[i] == 'U')
			num--;
		else
			num++;
	}
	for (int i = first; i <= first + 3; ++i)
		cout << i << " ";
	cout << endl;
	cout << num << endl;
}
}
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值