描述
写一个程序完成以下命令:
new id ——新建一个指定编号为id的序列(id<10000)
add id num——向编号为id的序列加入整数num
merge id1 id2——合并序列id1和id2中的数,并将id2清空
unique id——去掉序列id中重复的元素
out id ——从小到大输出编号为id的序列中的元素,以空格隔开
输入
第一行一个数n,表示有多少个命令( n<=200000)。以后n行每行一个命令。
输出
按题目要求输出。
样例输入
16
new 1
new 2
add 1 1
add 1 2
add 1 3
add 2 1
add 2 2
add 2 3
add 2 4
out 1
out 2
merge 1 2
out 1
out 2
unique 1
out 1
样例输出
1 2 3
1 2 3 4
1 1 2 2 3 3 4
1 2 3 4
#include
#include
#include
#include
using namespace std;
int n,id,num;
string s;
list a[200005];
list::iterator j;
int main()
{
scanf("%d",&n);
while(n--)
{
cin >> s;
if(s == "new") scanf("%d",&id);
if(s == "add") //加入整数
{
scanf("%d%d",&id,&num);
a[id].push_back(num);
}
if(s == "merge")//合并id1和id2,并将id2中的数清空
{
scanf("%d%d",&id,&num);
a[id].merge(a[num]);
}
if(s == "unique")
{
scanf("%d",&id);
a[id].sort();//去重之前需要从小到大排序
a[id].unique();
}
if(s == "out")
{
scanf("%d",&id);
if(!a[id].empty())//遍历从小到大输出
{
a[id].sort();
for(j = a[id].begin(); j != a[id].end(); ++j)
{
printf("%d ",*j);
}
printf("\n");
}
else//如果是空的,就输出空行
printf("\n");
}
}
return 0;
}
list知识点
list是一个线性双向链表结构,它的数据由若干个节点构成,每一个节点都包括一个信息块(即实际存储的数据)、一个前驱指针和一个后驱指针。它无需分配指定的内存大小且可以任意伸缩,这是因为它存储在非连续的内存空间中,并且由指针将有序的元素链接起来。由于其结构的原因,list 随机检索的性能非常的不好,因为它不像vector 那样直接找到元素的地址,而是要从头一个一个的顺序查找,这样目标元素越靠后,它的检索时间就越长。检索时间与目标元素的位置成正比。虽然随机检索的速度不够快,但是它可以迅速地在任何节点进行插入和删除操作。因为list 的每个节点保存着它在链表中的位置,插入或删除一个元素仅对最多三个元素有所影响,不像vector 会对操作点之后的所有元素的存储地址都有所影响,这一点是vector 不可比拟的。
list 的特点:
(1) 不使用连续的内存空间这样可以随意地进行动态操作;
(2) 可以在内部任何位置快速地插入或删除,当然也可以在两端进行push 和pop 。
(3) 不能进行内部的随机访问,即不支持[ ] 操作符和vector.at() ;
(4) 相对于verctor 占用更多的内存。
参考链接:https://www.cnblogs.com/loleina/p/5179677.html
list的操作
迭代器:
begin()
返回迭代器开始(公共成员函数)
end()
返回迭代器结束(公共成员函数)
rbegin()
反向迭代器返回开始反向(公共成员函数)
rend()
反向迭代器返回反向结束(公共成员函数)
cbegin()
const_iterator回到开始(公共成员函数)
cend()
返回const_iterator结束(公共成员函数)
crbegin()
返回const_reverse_iterator逆转开始(公共成员函数)
crend()
返回const_reverse_iterator扭转结束(公共成员函数)
容量capacity:
empty()
测试容器是否为空(公共成员函数)
size()
返回的大小(公共成员函数)
max_size
返回最大大小(公共成员函数)
元素访问:
front()
访问第一个元素(公共成员函数)
back()
访问的最后一个元素(公共成员函数)
修饰符Modifiers:
assign()
新内容分配给容器(公共成员函数)
emplace_front()
在开始构建和插入元素(公共成员函数)
push_front()
插入元素开始(公共成员函数)
pop_front()
删除第一个元素(公共成员函数)
emplace_back()
最后构造和插入元素(公共成员函数)
push_back()
末尾添加元素(公共成员函数)
pop_back()
删除最后一个元素(公共成员函数)
emplace()
构造和插入元素(公共成员函数)
insert()
插入元素(公共成员函数)
erase()
删除元素(公共成员函数)
swap()
交换内容(公共成员函数)
resize()
改变大小(公共成员函数)
clear()
清空内容(公共成员函数)
操作:
splice()
将元素从列表中列出(公共成员函数)
remove()
删除元素与特定的值(公共成员函数)
remove_if()
删除元素满足条件(公共成员函数模板)
unique()
删除重复的值(公共成员函数)
merge()
合并排序的列表(公共成员函数)
sort()
排序元素的容器(公共成员函数)
reserve()
改变元素的顺序(公共成员函数)
Observers:
get_allocator()
得到分配器(公共成员函数)
参考链接:https://www.cnblogs.com/ckings/p/3677561.html
push_front & push_back
#include
#include
#include
#include
#include
using namespace std;
void PrintIt(string& StringToPoint)
{
cout << StringToPoint << endl;
}
int main()
{
list test;
list::iterator testiterator;
test.push_back("no");
test.push_back("march");
test.push_front("ok");
test.push_front("loleina");
test.push_front("begin");
test.push_back("end");
for (testiterator = test.begin(); testiterator != test.end(); ++testiterator)
{
cout << *testiterator << endl;
}
cout << "-------------" << endl;
for_each(test.begin(), test.end(), PrintIt);
cout << "-------------" << endl;
system("PAUSE");
return 0;
}
merge
#include
#include
#include
using namespace std;
int main()
{
// 有序数据
int A1[]={1,2,3,4,5,6};
int A2[]={2,4,6,8,9,10};
// 无序数据
int A3[]={1,2,3,4,6,9};
int A4[]={5,6,7,8,9,2};
//有序链表
list iL1(A1, A1+6);
list iL2(A2, A2+6);
//无序链表
list iL3(A3, A3+6);
list iL4(A4, A4+6);
iL1.merge(iL2);
iL3.merge(iL4);
list::iterator it = iL1.begin();
while(it!=iL1.end())
{
cout<
count,count_if
#include
#include
#include
#include
#include
using namespace std;
class IsLoleina
{
public:
bool operator()(string& name)
{
return name == "loleina";
}
};
int main()
{
list test;
list score;
list::iterator testiterator;
test.push_back("no");
test.push_back("march");
test.push_front("ok");
test.push_front("loleina");
test.push_front("begin");
test.push_back("end");
score.push_back(100);
score.push_back(90);
score.push_back(80);
score.push_back(70);
score.push_back(100);
score.push_back(20);
int countNum(0);
countNum= count(score.begin(), score.end(), 100);
cout << "there are " << countNum << " scores of 100" << endl;
cout << "-------------" << endl;
int countLoleina(0);
countLoleina=count_if(test.begin(), test.end(), IsLoleina());
cout << "there are " << countLoleina << " loleina" << endl;
system("PAUSE");
return 0;
}
例题1:链表:约瑟夫问题 (两种解法)https://blog.csdn.net/yanyanwenmeng/article/details/86020093
例题2:链表:删除数组中的元素 STLhttps://blog.csdn.net/yanyanwenmeng/article/details/86020490
例题2:动态链表:统计学生信息 https://blog.csdn.net/yanyanwenmeng/article/details/86020774