目录
一、什么是list
list是STL容器中的容器,且元素在容器中的位置是分散的并与大小无关(不会自动排序)。list的底层是双向链表。
优势:
多用于需要大量数据的插入和删除,且对数据的随机访问比较少。
劣势:
无法通过“下标[ ]”直接访问元素,需要通过从头(尾)遍历元素找到元素。
二、访问遍历
for(list<char>::const_iterator it=lta.begin();it!=lta.end();++it)
cout<<*it;
cout<<endl;
三、插入
push_back(elem); //在容器尾部加入一个元素(elem)
.push_front(elem); //在容器开头插入一个元素(elem)
.insert(pos,elem); //在pos位置插elem元素的拷贝,返回新数据的位置
.insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值.
.insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值.
四、删除
.pop_back0; //删除容器中最后一个元素
.pop_front(); //从容器开头移除第一个元素
.clear(); //移除容器的所有数据
.erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置
.erase(pos); //删除pos位置的数据,返回下一个数据的位置
.remove(elem); //删除容器中所有与elem值匹配的元素
五、实战-L1-011 A-B
本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。
输入格式:
输入在2行中先后给出字符串A和B。两字符串的长度都不超过104,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。
输出格式:
在一行中打印出A−B的结果字符串。
输入样例:
I love GPLT! It's a fun game!
aeiou
输出样例:
I lv GPLT! It's fn gm!
不是正确的解法,如果用list来解决会超时。
#include <iostream>
#include <list>
using namespace std;
int main() {
list<char> lta;
char h;
// 修正第一个循环:读取到换行符停止,且不存入换行符
while (cin.get(h) && h != '\n') {
lta.push_back(h);
}
// 修正第二个循环:安全读取输入,避免死循环
char k;
while (cin.get(k) && k != '\n') {
lta.remove(k);
}
// 输出剩余字符
for (list<char>::const_iterator it = lta.begin(); it != lta.end(); ++it) {
cout << *it;
}
cout << endl;
return 0;
}
正确的解法:
#include <bits/stdc++.h>
using namespace std;
int main()
{
string a;
string b;
getline(cin,a);
getline(cin,b);
int k;
for(int i=0;i<b.length();i++)
{
k=a.find(b[i]);//寻找a中b的所含元素
if(k!=-1)
{
a.erase(k,1);//删除1个
i--;//因为要删除全部的,所以要返回重新找有没有也相同的
}
}
cout<<a;
return 0;
}