我有一个“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数据。 请任何人帮我从地图上的特定位置删除地图。
答案 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;