Шаблон карты C ++ не вставляется - PullRequest
0 голосов
/ 16 мая 2018

Я использую шаблон карты под названием ITV с определенной структурой в качестве значения ключа и набором пар целых чисел в качестве значения карты. По любой причине команда вставки просто не работает для некоторого ключевого значения.

Я сократил свой код до наименьшего возможного, но он все еще велик. Он может быть скомпилирован и выполнен и возвращает одну строку всякий раз, когда одна пара добавляется к значению карты некоторого домена, указывая значение ключа и размер соответствующего значения карты в это время.

К сожалению, в какой-то момент функции intervals() (в случае начальной дуги) команда вставки ничего не делает:

ITV[Domain(PairStr,q)].insert(make_pair(t,t)); // ERROR! DOES NOT WORK

Я думаю, это может быть связано с некоторым внутренним упорядочением класса карты, потому что ошибка возникает только тогда, когда 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

Извините за длинный пост, я был бы признателен за любую подсказку по этому поводу.

1 Ответ

0 голосов
/ 16 мая 2018

Ваш operator < не удовлетворяет требованиям std::map.В частности, у вас может быть пара Domain, которые оба меньше друг друга

Рассмотрим

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;

Самый простой способ синтезировать (общий) порядок из членов структурысостоит в том, чтобы собрать их в std::tuple, который формирует лексикографический порядок элементов.

bool Domain::operator<( const Domain & other ) {
    return std::tie(i, j, q) < std::tie(other.i, other.j, other.q);
}
...