在C ++中从Vector中删除元素

时间:2017-03-21 07:42:12

标签: c++ c++11 vector

我有一个“map”,它将“int”存储为键,将“Student”类对象存储为值。 将数据存储到地图中后(地图组:每个地图包含一个键和一个学生类对象作为值)我需要将这组地图存储到矢量中。我也做过。但是当我尝试从矢量中删除特定位置的地图时,只会删除矢量中的最后/结束地图。我想根据索引删除地图。

我的计划:

#include <map>  
#include <iostream>  
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

class Student
{

public:
    string name;
    int id;

void  setName(string nam)
{
        name = nam;
}
void setId(int i)
{
        id = i;
}
string  getName()
{
       return name;
}
int  getId()
{
       return id;
}
};


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)
{
coll.push_back(a);
}

int main()
{
     typedef  map<int, Student> map1;  
     Student s[5];
     Student s1;
     map1 m1;
     int i=0;
     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);

     for(int j=0;j<5;j++)
     {
      m1 =  mine(j,s[j]);
      print(m1);
     }

      cout<<endl<<endl;

      cout<<"Before Deleting size  = "<<coll.size()<<endl;

        map1 m2;
        Student st ;
        std::vector<map<int,Student>>::const_iterator k;

    for(k=coll.begin(); k!=coll.end(); ++k)
    {
        m2 = coll[i];
        st = m2.at(i);
        std::cout <<" "<< st.getName()<<std::endl;
        i++;
    }

    coll.erase(coll.begin() + 2);    //Should delete 3 element but not deleting

    cout<<"\nAfter Deleting :\n"<<endl;
    i=0;
     for(k=coll.begin(); k!=coll.end(); ++k)
    {
        m2 = coll[i];
        st = m2.at(i);
        std::cout <<" "<< st.getName()<<std::endl;
        i++;
    }
    /*
     coll.erase(std::remove(coll.begin(), coll.end(), m1), coll.end()); 
     This one also not working
    */
    return 0;
}

当我尝试显示元素时,我可以显示前4个元素但不显示最后一个元素。实际上程序应该从向量中删除3个元素(即第3个映射)并显示所有其他映射:1,2, 4,5数据。 请任何人帮我从地图上的特定位置删除地图。

2 个答案:

答案 0 :(得分:1)

代码工作正常,不确定您的期望,但此代码

for (int j = 0; j<5; j++) {
    m1 = mine(j, s[j]);
    print(m1);
}

可以简化为:

Student s[5];
s[0].setName("SAI");
s[1].setName("RAVI");
s[2].setName("RAJU");
s[3].setName("HemaChandra");
s[4].setName("Tushar");

vector<map<int, Student>> coll;
map<int, Student> m1;
for(int i = 0; i < 5; ++i) {
   m1.emplace(i, s[i]);
   coll.push_back(m1); // You're push_back'ing a copy of the map each time,
                       // and each time it will have a new element in it
}

所以你的行

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

实际上只删除了矢量中的第三个地图:

vector {
    0: map { SAI };
    1: map { SAI, RAVI };
    2: map { SAI, RAVI, RAJU }; <- this is deleted
    3: map { SAI, RAVI, RAJU, HemaChandra };
    4: map { SAI, RAVI, RAJU, HemaChandra, Tushar };
}

打印索引为0, 1, 2, 3的元素将产生SAI, RAVI, RAJU, HemaCHandra。如果你改为打印最后的那些

  cout << "\nAfter Deleting :\n" << endl;
  for (k = coll.begin(); k != coll.end(); ++k)
  {
    st = k->rbegin()->second; // Get the last one in each map
    std::cout << " " << st.getName() << std::endl;
  }

您将获得SAI, RAVI, HemaChandra, Tushar

答案 1 :(得分:0)

一切都被删除就好了,您可以在调试器中查看它。

问题在于行

st = m2.at(i);

在第二个打印循环中,您可以访问您正在存储的1, 2, 3, 4个元素map,而不是您期望的元素1, 2, 4, 5。可以通过将此行更改为

来修复此代码
st = m2.rbegin()->second;