前言
今天的题目是移除列表中不想要的元素
一、Python代码
class Rmlist:
def __init__(self, list1):
self.list1 = list1
def rmlsit(self, target):
self.list1 = [i for i in self.list1 if i != target]
for i in self.list1:
print(i, end=" ")
if __name__ == "__main__":
a = input("请输入一串数字,用空格隔开:")
try:
a = [int(i) for i in a.split()]
rm = Rmlist(a)
rm.rmlsit(int(input("请输入要删除的数字:")))
except ValueError:
print("输入错误,请输入数字")
这里有一个很容易错的点
class Rmlist:
def __init__(self, list1):
self.list1 = list1
def rmlsit(self, target):
for i in range(len(self.list1)):
if self.list1[i] == target:
self.list1.pop(i)
for i in self.list1:
print(i, end=" ")
这样写是错的,因为for循环中,一边遍历一边删除,列表中元素的下标在不断变化中,所以不可使用下标遍历删除
二、C++代码
1.头文件
#ifndef RMLIST_H
#define RMLIST_H
#include <vector>
class Rmlist
{
public:
Rmlist(std::vector<int> & list2);
void RMlist(int target);
private:
std::vector<int> list1;
};
#endif
2.源文件
#include <vector>
#include <iostream>
#include "rmlist.h"
#include <algorithm>
using namespace std;
Rmlist::Rmlist(vector<int> &list2):list1(list2)
{}
void Rmlist::RMlist(int target)
{
this->list1.erase(remove_if(this->list1.begin(), this->list1.end(), [target](int val){return val == target;}), this->list1.end());
for (vector<int>::iterator it = this->list1.begin(); it != this->list1.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
这里remove_if和erase的搭配使用,[target](int val){return val == target;}这是一个lambda函数,捕获参数target,传回结果为true
3.执行文件
#include <iostream>
#include "rmlist.h"
#include <string>
#include <sstream>
#include <algorithm>
#include <vector>
using namespace std;
int main(int argc, char **argv)
{
string line;
vector<int> list1;
int a ;
int target;
cout << "请输入你的链表,用空格隔开:";
getline(cin, line);
istringstream iss(line);
while(iss >> a)
{
list1.push_back(a);
}
cout << "请输入你想要移除的元素:";
cin >> target;
Rmlist rm(list1);
rm.RMlist(target);
}
这里有一点注意就是iss相当于cin,但是iss是用字符串中读取数据,iss>>a 读取出来的数据的类型取决于a的类型,如果a为int,就会读取一个个的数字(以空格为分隔),如果a为char,每次就只会读取一个字母。
总结
复习使用了istringstream和remove_if与erase的搭配使用