STL容器增删改查?
参考:
#include <iostream>
#include <map>
#include <vector>
using namespace std;
class CStudent
{
private:
int nID;//学号
string strName;//学生姓名
map<int, double> mapScores; //各科成绩,<课程号,成绩>
public:
CStudent(int _nID, string _strName)
{
nID = _nID;
strName = _strName;
}
void setID(int _nID)
{
nID = _nID;
}
int getID()
{
return nID;
}
void setName(string _name)
{
strName = _name;
}
string getName()
{
return strName;
}
map<int, double> getScores()
{
return mapScores;
}
void insertScore(int cno, double score) // Add a course score
{
map<int, double>::iterator it = mapScores.find(cno);
if (it != mapScores.end())
{
mapScores.erase(it);
}
mapScores.insert(pair<int, double>(cno, score));
}
void eraseScore(int cno) // Delete a course score
{
map<int, double>::iterator it = mapScores.find(cno);
if (it != mapScores.end())
{
mapScores.erase(it);
}
}
void display() // Output student nID, strName, and all course scores
{
cout << nID << "\t" << strName << "\t";
map<int, double>::iterator it = mapScores.begin();
for (; it != mapScores.end(); it++)
cout << it->first << ":" << it->second << " ";
cout << endl;
}
};
//新增
void addStudent(vector<CStudent>& vStus)
{
int id;
string name;
cout << "请输入学生学号:";
cin >> id;
cout << "请输入学生姓名:";
cin >> name;
CStudent s(id, name);
int cno, n;
double score;
cout << "请输入该学生成绩个数:";
cin >> n;
for (int i = 0; i < n; i++)
{
cout << "请输入第" << i + 1 << "门课程的课程号及成绩:";
cin >> cno >> score;
s.insertScore(cno, score);
}
cout << "插入成功!" << endl;
vStus.push_back(s);
}
//删除
void deleteStudent(vector<CStudent>& vStus)
{
int id;
cout << "请输入需要删除的学生的学号:";
cin >> id;
vector<CStudent>::iterator it = vStus.begin();
for (; it != vStus.end(); it++)
{
if (id == (*it).getID())
{
vStus.erase(it);
cout << "成功删除该学生信息!" << endl;
return;
}
}
cout << "未找到该学生信息!" << endl;
}
//改
void modStudent(vector<CStudent>& vStus)
{
int id;
string name;
int cno;
double score;
char ch;
cout << "请输入要修改信息的学生学号:";
cin >> id;
cin.get(); //吸收回车符
vector<CStudent>::iterator it = vStus.begin();
for( ; it != vStus.end(); it++)
{
if (id == (*it).getID())
{
cout << "是否修改姓名(Y/N)?";
ch = cin.get();
if (ch == 'y' || ch == 'Y')
{
cout << "请输入新姓名:";
cin >> name;
(*it).setName(name);
cin.get();
}
cout << "是否修改成绩(Y/N)?";
ch = cin.get();
if (ch == 'y' || ch == 'Y')
{
cout << "请输入要修改的成绩个数:";
int n;
cin >> n;
for (int k = 0; k < n; k++)
{
cout << "请输入要修改的课程号及成绩:";
cin >> cno >> score;
(*it).insertScore(cno, score); //如果已经存在,则修改,否则直接插入
}
cin.get(); //吸收回车符
}
cout << "修改成功!" << endl;
return;
}
}
cout << "未找到该学生信息!" << endl;
}
//查
void searchStudent(vector<CStudent> vStus)
{
int nId;
cout << "请输入要查找的学生学号:";
cin >> nId;
vector<CStudent>::iterator it = vStus.begin();
for (; it != vStus.end(); it++)
{
if (nId == (*it).getID())
{
(*it).display();
return;
}
}
cout << "未找到该学生信息!" << endl;
}
//显示全部
void showAllStudents(vector<CStudent> vStus)
{
vector<CStudent>::iterator it = vStus.begin();
for (; it != vStus.end(); it++)
(*it).display();
}
int main()
{
int op;
vector<CStudent> vStus;
while (1)
{
system("cls"); //清屏
cout << "1.新增学生信息" << endl;
cout << "2.删除学生信息" << endl;
cout << "3.修改学生信息" << endl;
cout << "4.查找学生信息" << endl;
cout << "5.显示所有学生信息" << endl;
cout << "0.退出" << endl;
cout << "请选择:";
cin >> op;
switch (op)
{
case 0:
return 0;
case 1:
addStudent(vStus);
break;
case 2:
deleteStudent(vStus);
break;
case 3:
modStudent(vStus);
break;
case 4:
searchStudent(vStus);
break;
case 5:
showAllStudents(vStus);
break;
default:
break;
}
system("pause");
}
}
迭代器都可以进行++操作。反向迭代器和正向迭代器的区别在于:
对正向迭代器进行++操作时,迭代器会指向容器中的后一个元素;
而对反向迭代器进行++操作时,迭代器会指向容器中的前一个元素。
随机访问迭代器,可以使用+n来指向后面的第n个元素
vector<int> ret(5),ret_new(5);
vector<int>::iterator pd1,pd2;
pd1 = ret.begin();
pd2 = ret.end();
ret.erase(pd1 + 1,pd1 + 3);
ret.insert(pd1 + 2,ret_new.begin() + 1,ret_new.end());