我正在尝试解决此问题:Search multiple list for missing entries。我使用多图来复制密钥。这是我的代码:
#include <iostream>
#include <map>
#include <list>
#include <utility>
using namespace std;
int main(){
list<char>a;
list<int> b;
multimap<char,int>s;
a.push_back('A');
a.push_back('B');
a.push_back('C');
b.push_back(1);
b.push_back(2);
b.push_back(3);
s.insert(std::pair<char,int>('A',1));
s.insert(std::pair<char,int>('A',2));
s.insert(std::pair<char,int>('B',2));
s.insert(std::pair<char,int>('B',3));
s.insert(std::pair<char,int>('C',1));
s.insert(std::pair<char,int>('C',3));
list<char>::iterator it;
list<int>::iterator IT;
multimap<char,int>::iterator i;
for (i=s.begin();i!=s.end();i++){
for (IT=b.begin();IT!=b.end();IT++){
i=s.find(*IT);
if (i==s.end()){
cout<<(*i).first<< " "<<*IT<<endl;
}
}
}
return 0;
}
它已编译但在我运行后它会停止异常运行。我想我没有正确访问元素。请帮我。 编辑: 我已经更新了我的代码
#include <iostream>
#include <map>
#include <list>
#include <utility>
using namespace std;
int main(){
list<char>a;
list<int> b;
multimap<char,int>s;
a.push_back('A');
a.push_back('B');
a.push_back('C');
b.push_back(1);
b.push_back(2);
b.push_back(3);
s.insert(std::pair<char,int>('A',1));
s.insert(std::pair<char,int>('A',2));
s.insert(std::pair<char,int>('B',2));
s.insert(std::pair<char,int>('B',3));
s.insert(std::pair<char,int>('C',1));
s.insert(std::pair<char,int>('C',3));
list<char>::iterator it;
list<int>::iterator IT;
multimap<char,int>::iterator i;
for (it=a.begin();it!=a.end();it++){
for (i=s.begin();i!=s.end();i++){
for (IT=b.begin();IT!=b.end();IT++){
if ((*i).first==*it && ((*i).second!=*IT)){
cout<<(*i).first<< " "<<*IT<<endl;
}
}
}
}
return 0;
}
但是这里有太多的组合,那么我需要什么是问题?我认为它应该正常工作
答案 0 :(得分:3)
你的问题在于:
if (i==s.end()){
cout<<(*i).first<< " "<<*IT<<endl;
}
如果我是s.end()你不能再访问它了。这意味着它无效。 你需要检查它是不是s.end()
if( i != s.end() )
这就是你崩溃的原因。但是,我有这样的问题,理解你打算为如何解决问题提出更好的建议。
编辑:
问题的解决方案可能是:
#include <map>
#include <set>
#include <iostream>
struct d {
char c;
int i;
};
int main()
{
d data[] = {
{ 'A', 1 },
{ 'A', 2 },
{ 'B', 2 },
{ 'B', 3 },
{ 'C', 1 },
{ 'C', 3 }
};
std::map< char, std::set<int> > data_map;
for( size_t i = 0; i < sizeof(data)/sizeof(d); ++i ) {
data_map[ data[i].c ].insert( data[i].i );
}
for( char c = 'A'; c < 'D'; ++c ) {
for( int i = 1; i < 4; ++i ) {
if( data_map[c].count( i ) == 0 ) {
std::cout << c << " " << i << " is missing" << std::endl;
}
}
}
return 0;
}
输出:
A 3 is missing B 1 is missing C 2 is missing
答案 1 :(得分:1)
一些提示开始 -
在调试器中运行代码(VS 2008 express是免费的) - 执行代码,检查变量,你应该看到错误。
重命名你的迭代器,以便更清楚你想要做什么 - 我,它和IT只会导致混乱。
最后 - 在编码之前写下你要做的事情 - 比如
For (all letters)
{
For (all numbers)
{
if (letter,number not in map)
print out missing (letter, number)
}
}