C++ 基于索引不起作用的C+;从向量中删除元素+;Visual Studio

C++ 基于索引不起作用的C+;从向量中删除元素+;Visual Studio,c++,c++11,visual-studio-2012,vector,C++,C++11,Visual Studio 2012,Vector,我有一个向量,它接受map对象作为元素,其中Student是一个包含学生组名称和Id的类。 在将地图存储到矢量中之后,现在我想根据索引或地图本身删除地图。这意味着如果我想删除矢量中的地图2,那么它应该删除地图2或第二个元素。我曾使用erase、iterator等删除元素,但使用iterator时出现以下错误: 错误3错误C2678:二进制“==”:未找到接受“const Student”类型左侧操作数的运算符(或没有可接受的转换) 当我使用: coll.erase(coll.begin()+2)

我有一个向量,它接受map对象作为元素,其中Student是一个包含学生组名称和Id的类。 在将地图存储到矢量中之后,现在我想根据索引或地图本身删除地图。这意味着如果我想删除矢量中的地图2,那么它应该删除地图2或第二个元素。我曾使用erase、iterator等删除元素,但使用iterator时出现以下错误:

错误3错误C2678:二进制“==”:未找到接受“const Student”类型左侧操作数的运算符(或没有可接受的转换)

当我使用:

coll.erase(coll.begin()+2)

无论我提供什么索引,我只能删除向量的结束/最后一个元素,但不能删除位置2处的贴图

我的节目:

#include <map>  
#include <iostream>  
#include "student.h"
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

static int i=0,j=1;
vector<map<int,Student>> coll;
typedef std::map<int,Student> Mymap;  
Mymap c1;

map<int, Student> mine(int key,Student value)
{   

    c1.insert(Mymap::value_type( key,value));   
    return c1;   
}   

void print(Mymap a)
{

Mymap m2;
coll.push_back(a);
m2 = coll[i];
i++;
Student s1 = m2.at(j);
j++;

}
int main()
{
     typedef  map<int, Student> map1;  
     Student s[5];
     Student s1;
     map1 m1;
     s[0].setName("SAI");
     s[1].setName("RAVI");
     s[2].setName("RAJU");
     s[3].setName("HemaChandra");
     s[4].setName("Tushar");

     s[0].setId(10);
     s[1].setId(20);
     s[2].setId(30);
     s[3].setId(40);
     s[4].setId(50);

     m1 =  mine(1,s[0]);
     s1 = m1.at(1);   
     print(m1);

     m1 = mine(2,s[1]);
     s1 = m1.at(2);   
     print(m1);

     m1 = mine(3,s[2]);
     s1 = m1.at(3);   
     print(m1);

     m1 =  mine(4,s[3]);
     s1 = m1.at(4);
     print(m1);

     m1 =  mine(5,s[4]);
     s1 = m1.at(5);
     print(m1);

      cout<<endl<<endl;

      cout<<"Before Deleting"<<endl;
      for(int i=0,j=1;i<coll.size();i++,j++)
    {
        Mymap m3 = coll[i];
        Student st = m3.at(j);
        std::cout <<" "<< st.getName()<<std::endl;
    }

      cout<<"\nAfter Deleting"<<endl;

      coll.erase(coll.begin()+2);

    //  coll.erase(std::remove(coll.begin(), coll.end(), m1), coll.end()); -------Error when using this statement

    for(int i=0,j=1;i<coll.size();i++,j++)
    {
        Mymap m3 = coll[i];
        Student st = m3.at(j);
        std::cout <<" "<< st.getName()<<std::endl;
    }

    return 0;
}
#include<iostream>
using namespace std;

class Student
{
public:
    string name;
    int id;
    void  setName(string nam);
    void  setId(int i);
    string  getName();
    int getId();

};
Student.h:

#include <map>  
#include <iostream>  
#include "student.h"
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

static int i=0,j=1;
vector<map<int,Student>> coll;
typedef std::map<int,Student> Mymap;  
Mymap c1;

map<int, Student> mine(int key,Student value)
{   

    c1.insert(Mymap::value_type( key,value));   
    return c1;   
}   

void print(Mymap a)
{

Mymap m2;
coll.push_back(a);
m2 = coll[i];
i++;
Student s1 = m2.at(j);
j++;

}
int main()
{
     typedef  map<int, Student> map1;  
     Student s[5];
     Student s1;
     map1 m1;
     s[0].setName("SAI");
     s[1].setName("RAVI");
     s[2].setName("RAJU");
     s[3].setName("HemaChandra");
     s[4].setName("Tushar");

     s[0].setId(10);
     s[1].setId(20);
     s[2].setId(30);
     s[3].setId(40);
     s[4].setId(50);

     m1 =  mine(1,s[0]);
     s1 = m1.at(1);   
     print(m1);

     m1 = mine(2,s[1]);
     s1 = m1.at(2);   
     print(m1);

     m1 = mine(3,s[2]);
     s1 = m1.at(3);   
     print(m1);

     m1 =  mine(4,s[3]);
     s1 = m1.at(4);
     print(m1);

     m1 =  mine(5,s[4]);
     s1 = m1.at(5);
     print(m1);

      cout<<endl<<endl;

      cout<<"Before Deleting"<<endl;
      for(int i=0,j=1;i<coll.size();i++,j++)
    {
        Mymap m3 = coll[i];
        Student st = m3.at(j);
        std::cout <<" "<< st.getName()<<std::endl;
    }

      cout<<"\nAfter Deleting"<<endl;

      coll.erase(coll.begin()+2);

    //  coll.erase(std::remove(coll.begin(), coll.end(), m1), coll.end()); -------Error when using this statement

    for(int i=0,j=1;i<coll.size();i++,j++)
    {
        Mymap m3 = coll[i];
        Student st = m3.at(j);
        std::cout <<" "<< st.getName()<<std::endl;
    }

    return 0;
}
#include<iostream>
using namespace std;

class Student
{
public:
    string name;
    int id;
    void  setName(string nam);
    void  setId(int i);
    string  getName();
    int getId();

};
#包括
使用名称空间std;
班级学生
{
公众:
字符串名;
int-id;
void setName(字符串名称);
void setId(inti);
字符串getName();
int getId();
};
我所需要的是,我想从向量中删除特定位置的贴图。也就是说,如果我想删除位置2处的地图,则应删除该地图;如果我想删除位置“n”处的地图,则应删除第n个地图。请帮我修一下这个。我找不到我在哪里犯了错误

当我使用erase()函数时,我遇到以下编译器错误:


您可能需要在类wStudent中实现运算符==显示
学生的代码。看起来您缺少一个比较运算符。谢谢。我添加了程序谢谢你的帮助。但是我没有得到你的帮助。在程序中我应该在哪里使用std::advance?@HemaChandra nvm我误读了你的代码。我还添加了错误。Thanks@dyp失败的是map::erase,但这是正确的。@Borgeader也是map int->Student,因此map只需要编辑代码中的
@dyp:
//coll.erase(std::remove(coll.begin(),coll.end(),m1),coll.end())-------使用此语句时出错
这需要进行比较,因为我们正在擦除一个值。我需要从存储在vector@Borgleader哦!到目前为止我还没有看到它。