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( {1,2});
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;
}