通过迭代器打印出地图的值
Print out values of a map by an iterator
一些借口:
class CComplex:CHotel
{
protected:
string m_complex;
vector<CHotel> m_hoteli;
public:
CComplex(){};
CComplex(string filename, string nComplex)
{
string str;
m_complex = nComplex;
fstream file(filename, ios::in);
if (file.is_open())
{
string str;
bool dfFlag = false;
//CHotel temp(" ", 0, 0);
//while (file >> temp)
while (getline(file,str))
{
CHotel temp(str);
m_hoteli.push_back(str);
}
file.close();
}
else
throw "ERROR! ";
}
我正在阅读的文件:
Marina 5 500 Joe|21|1|Tisho|20|6|Victoria|31|20
Tulip 4 400 Sarah|41|17|Rositsa|49|14|Valeria|24|2
BlackSea 3 300 John|35|12|Jon|35|11|Janni|28|6
SwissBell 5 600 Orlin|26|1|Margarita|27|2|Juliette|31|3
这就是我用 CHotel
个对象填充 m_hoteli
向量的方式,其中包括 CTurist
个对象。
通过使用断点和测试,我 100% 确定我收到了酒店值。它也收到了学生的价值观,但我没有对此进行测试。
这就是它的代码:
CHotel(string s)
{
CTurist b("",0);
bool first = true;
istringstream TList(s);
string Days;
int i = 0;
string ime;
string godini;
if (first == true) {
while (getline(TList, s, ' ')) //прочита целия ред като разделя стойностите базирано на разстояние
{
switch (i)
{
case 0: this->hName = s; break; //взима стойността във файла,която е за име на хотел
case 1:this->stars = stoi(s); break;
case 2:this->beds = stoi(s); break;
}
i++;
if (i == 3)break;
}
first = false; //сменя на false, за да се изпълни долния while
i = 0; //нулира, за да се стартира наново
}
while (getline(TList, s, '|')) ////прочита целия ред като разделя стойностите базирано на |
{
switch (i)
{
case 0: ime= s; break; //взима стойността във файла,която е за име на турист
case 1: godini = s; break; //взима стойността във файла,която е за години на турст
case 2: Days = s; break; //взима стойността във файла,която е за престой на турист
}
i++;
if (i == 3)
{
//CTurist T1("ime", stoi(Days));
CTurist T1(ime, stoi(godini));
Turisti[T1] = stoi(Days);
//Turisti.insert(T1("ime", stoi(Days))=Days);
i = 0;
}
}
}
...
}
我的问题是我无法列出每家酒店的游客。这就是我的功能:
void outputInfo()
{
for (int i = 0; i < m_hoteli.size(); i++) {
cout << "Tourists for hotel " << m_hoteli[i].getName2() << endl;
std::map<CTurist, unsigned>::iterator it = Turisti.begin();
for (auto it = Turisti.begin(); it != Turisti.end(); ++it) {
cout << " Tourist: " << m_hoteli[i].Turisti[it].getName()
<< " Vuzrast: " << m_hoteli[i].Turisti[it].getAge()<< endl;
}
}
}
这一行:
cout << " Tourist: " << m_hoteli[i].Turisti[it].getName();
我收到以下错误:
No operator[] matches these operands.
知道去这里的路是什么吗?
您可以像这样正确使用迭代器来修复错误:
for (int i = 0; i < m_hoteli.size(); i++)
{
std::map<CTurist, unsigned>::iterator it = m_hoteli[i].Turisti.begin();
for (; it != m_hoteli[i].Turisti.end(); ++it)
{
cout << " Tourist: " << it->first.getName(); // ...
}
}
不过这样更好
for (auto & hotel : m_hoteli)
{
cout << "Tourists for hotel " << hotel.getName2() << endl;
for (auto & mapElement : hotel.Turisti)
{
cout << " Tourist: " mapElement.first.getName(); // ...
}
}
要获得游客的天数,您可以使用 mapElement.second
。
一些借口:
class CComplex:CHotel
{
protected:
string m_complex;
vector<CHotel> m_hoteli;
public:
CComplex(){};
CComplex(string filename, string nComplex)
{
string str;
m_complex = nComplex;
fstream file(filename, ios::in);
if (file.is_open())
{
string str;
bool dfFlag = false;
//CHotel temp(" ", 0, 0);
//while (file >> temp)
while (getline(file,str))
{
CHotel temp(str);
m_hoteli.push_back(str);
}
file.close();
}
else
throw "ERROR! ";
}
我正在阅读的文件:
Marina 5 500 Joe|21|1|Tisho|20|6|Victoria|31|20
Tulip 4 400 Sarah|41|17|Rositsa|49|14|Valeria|24|2
BlackSea 3 300 John|35|12|Jon|35|11|Janni|28|6
SwissBell 5 600 Orlin|26|1|Margarita|27|2|Juliette|31|3
这就是我用 CHotel
个对象填充 m_hoteli
向量的方式,其中包括 CTurist
个对象。
通过使用断点和测试,我 100% 确定我收到了酒店值。它也收到了学生的价值观,但我没有对此进行测试。 这就是它的代码:
CHotel(string s)
{
CTurist b("",0);
bool first = true;
istringstream TList(s);
string Days;
int i = 0;
string ime;
string godini;
if (first == true) {
while (getline(TList, s, ' ')) //прочита целия ред като разделя стойностите базирано на разстояние
{
switch (i)
{
case 0: this->hName = s; break; //взима стойността във файла,която е за име на хотел
case 1:this->stars = stoi(s); break;
case 2:this->beds = stoi(s); break;
}
i++;
if (i == 3)break;
}
first = false; //сменя на false, за да се изпълни долния while
i = 0; //нулира, за да се стартира наново
}
while (getline(TList, s, '|')) ////прочита целия ред като разделя стойностите базирано на |
{
switch (i)
{
case 0: ime= s; break; //взима стойността във файла,която е за име на турист
case 1: godini = s; break; //взима стойността във файла,която е за години на турст
case 2: Days = s; break; //взима стойността във файла,която е за престой на турист
}
i++;
if (i == 3)
{
//CTurist T1("ime", stoi(Days));
CTurist T1(ime, stoi(godini));
Turisti[T1] = stoi(Days);
//Turisti.insert(T1("ime", stoi(Days))=Days);
i = 0;
}
}
}
...
}
我的问题是我无法列出每家酒店的游客。这就是我的功能:
void outputInfo()
{
for (int i = 0; i < m_hoteli.size(); i++) {
cout << "Tourists for hotel " << m_hoteli[i].getName2() << endl;
std::map<CTurist, unsigned>::iterator it = Turisti.begin();
for (auto it = Turisti.begin(); it != Turisti.end(); ++it) {
cout << " Tourist: " << m_hoteli[i].Turisti[it].getName()
<< " Vuzrast: " << m_hoteli[i].Turisti[it].getAge()<< endl;
}
}
}
这一行:
cout << " Tourist: " << m_hoteli[i].Turisti[it].getName();
我收到以下错误:
No operator[] matches these operands.
知道去这里的路是什么吗?
您可以像这样正确使用迭代器来修复错误:
for (int i = 0; i < m_hoteli.size(); i++)
{
std::map<CTurist, unsigned>::iterator it = m_hoteli[i].Turisti.begin();
for (; it != m_hoteli[i].Turisti.end(); ++it)
{
cout << " Tourist: " << it->first.getName(); // ...
}
}
不过这样更好
for (auto & hotel : m_hoteli)
{
cout << "Tourists for hotel " << hotel.getName2() << endl;
for (auto & mapElement : hotel.Turisti)
{
cout << " Tourist: " mapElement.first.getName(); // ...
}
}
要获得游客的天数,您可以使用 mapElement.second
。