c++ - C++ 地图模板不插入
问题描述
我正在使用一个名为 ITV 的映射模板,其中定义的结构作为键值,一组整数对作为映射值。出于任何原因,插入命令根本不适用于某些键值。
我已将我的代码减少到最小,但它仍然很大。可以编译执行,每次在某个域的map值中加上一对就返回一行,表示当时关联的map值的key值和大小。
不幸的是,在函数的某个点intervals()
(在初始弧的情况下)插入命令什么都不做:
ITV[Domain(PairStr,q)].insert(make_pair(t,t)); // ERROR! DOES NOT WORK
我想这可能与地图类的某些内部排序有关,因为只有在 is 时才会出现错误,这PairStr
是("INI", "A")
唯一的情况PairStr.first > PairStr.second
,但我真的对此一无所知。
#include <iostream>
#include <vector>
#include <map>
#include <iterator>
#include <string>
#include <set>
using namespace std;
typedef set<pair<string,string> > SPS;
typedef set<pair<string,string> >::iterator SPSIt;
struct Domain {
string i;
string j;
int q;
Domain() : i("NaNode"), j("NaNode"), q(-1) {}
Domain(string oi, string oj, int oq) : i(oi), j(oj), q(oq) {}
Domain(pair<string,string> ops, int oq) : i(ops.first), j(ops.second), q(oq) {}
bool operator< (Domain const &domain) const {
return i < domain.i || j < domain.j || q < domain.q;
}
};
// GRAPH STRUCTURE
SPS ARCS, INIT_ARCS, DEST_ARCS, TOTAL_ARCS;
map<Domain ,set<pair<int,int> > > ITV;
// TIME and SO ON
int T_MAX, Q_MAX; // number of periods and stages
vector<int> STG_first; // first and last period of stage q
vector<int> STG_last;
void intervals(){
pair<string,string> PairStr; // auxiliar variable
// loop for generating intervals
for(SPSIt it = TOTAL_ARCS.begin(); it != TOTAL_ARCS.end(); ++it)
for(int q = 0; q < Q_MAX; ++q)
for(int t = STG_first[q]; t<= STG_last[q]; ++t){
PairStr = *it;
// Case regular arc
if (ARCS.count(PairStr)){
for(int v = t; v <= STG_last[q]; ++v){
ITV[Domain(PairStr,q)].insert(make_pair(t,v));
cout << "Size of " << PairStr.first << "-" << PairStr.second << " at " << q << ": " << ITV[Domain(PairStr,q)].size() << endl;
}
// Case initial arc
} else if (INIT_ARCS.count(PairStr)){
ITV[Domain(PairStr,q)].insert(make_pair(t,t)); // ERROR! DOES NOT WORK
cout << "Size of " << PairStr.first << "-" << PairStr.second << " at " << q << ": " << ITV[Domain(PairStr,q)].size() << endl;
// Case destination arc
} else if (DEST_ARCS.count(PairStr) && q > 0){
ITV[Domain(PairStr,q)].insert(make_pair(t,t));
cout << "Size of " << PairStr.first << "-" << PairStr.second << " at " << q << ": " << ITV[Domain(PairStr,q)].size() << endl;
}
}// end loop
}// end intervals()
int main (){
// read arcs
ARCS.insert(make_pair("A", "B"));
TOTAL_ARCS.insert(make_pair("A", "B"));
INIT_ARCS.insert( make_pair("INI", "A"));
TOTAL_ARCS.insert(make_pair("INI", "A"));
DEST_ARCS.insert( make_pair("B", "DES"));
TOTAL_ARCS.insert(make_pair("B", "DES"));
// read number of periods and stages
T_MAX = 3;
Q_MAX = 2;
STG_first = vector<int> (Q_MAX);
STG_last = vector<int> (Q_MAX);
STG_first[0] = STG_last[0] = 0;
STG_first[1] = 1;
STG_last[1] = 2;
intervals();
return 0;
} // END main
所需的输出如下:
Size of A-B at 0: 1
Size of A-B at 1: 1
Size of A-B at 1: 2
Size of A-B at 1: 3
Size of B-DES at 1: 1
Size of B-DES at 1: 2
Size of INI-A at 0: 1
Size of INI-A at 1: 1
Size of INI-A at 1: 2
但是当前的输出是这个:
Size of A-B at 0: 1
Size of A-B at 1: 1
Size of A-B at 1: 2
Size of A-B at 1: 3
Size of B-DES at 1: 1
Size of B-DES at 1: 2
Size of INI-A at 0: 0
Size of INI-A at 1: 0
Size of INI-A at 1: 0
对不起,很长的帖子,我会很感激任何关于这个的提示。
解决方案
你的operator <
不满足std::map
要求。特别是,您可以有一对Domain
彼此小于的 s
考虑
Domain A("1", "2", 0);
Domain B("2", "1", 0);
std::cout << std::boolalpha << "A < B " << (A < B) << std::endl;
std::cout << std::boolalpha << "B < A " << (B < A) << std::endl;
从结构的成员中合成(总)顺序的最简单方法是将它们组装成 a std::tuple
,从而形成成员的字典顺序。
bool Domain::operator<( const Domain & other ) {
return std::tie(i, j, q) < std::tie(other.i, other.j, other.q);
}
推荐阅读
- mysql - 如何从 mysql 中的函数获取多个元组输出
- javascript - 打开页面时尝试获取非对象错误的属性
- python - 交换 3 个列表的元素并生成 4 个列表
- angular - 如何在合并/推送/提交 git 命令之前强制执行 tslint 规则
- pdf - 将图像、文本、CSV 文件、MS office doc 转换为 PDF 并将其合并为单个 PDF
- java - 如何使用 Java 对字符串进行排序
- c - C 编程中的 printf("%2d")
- java - 使用 oops 进行系统设计
- python - 带有打印功能的python重定向标准输出,是否可以扩展到多个输出,时间是什么?
- python - 并行化蒙特卡洛树搜索