2017-01-11 9 views
0
typedef struct A{ 
     string id; 
     long date; 
     // operator = and < overloading 
    }Test; 

Map<Test, double> testMap[2]; 

В коде массив testMap заполняется ключами и значениями с помощью некоторой бизнес-логики.Карты с ключом как структурой

Мне нужно вычислить общее двойное значение обеих карт для каждого A.id. Обратите внимание, что суммирование должно основываться только на A.id не по всему структурному ключу.
Для этого я могу применить обычный метод грубой силы, используя цикл for и получить результат.

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

+0

Есть ли причина, по которой вы не используете это: Карта testMap [2]; ? – user

+0

Для каждого идентификатора у нас могут быть разные транзакции на разные даты. Так сделал ключ карты как комбинацию идентификатора и даты. – user1706047

+0

Кажется, что 'map , long >> test_map [2]' может работать лучше в этом конкретном случае. – evan

ответ

1

Один из способов сделать это было бы применить вложенную std::accumulate дважды, один раз суммировать массивы и для каждого массива подытожить карта содержимое в:

struct Test 
{ 
    string id; 
    long date; 
    bool operator<(Test const& test) const 
    { 
     if(date == test.date) 
      return id < test.id; 
     return date < test.date; 
    } 
}; 

double sum_per_id(std::array<std::map<Test, double>, 2> const& testMapArray, 
    std::string const& id) 
{ 
    return std::accumulate(std::begin(testMapArray), std::end(testMapArray), 0.0, 
    [&id](double d, std::map<Test, double> const& testMap) 
    { 
     return d + std::accumulate(std::begin(testMap), std::end(testMap), 0.0, 
     [&id](double d, std::map<Test, double>::value_type const& p) 
     { 
      if(id == p.first.id) 
       return d + p.second; 
      return d; 
     }); 
    }); 
} 

int main() 
{ 
    std::array<std::map<Test, double>, 2> testMapArray; 

    testMapArray[0][{"A", 0}] = 0.1; 
    testMapArray[0][{"B", 1}] = 0.2; 

    testMapArray[1][{"A", 2}] = 0.3; 
    testMapArray[1][{"B", 3}] = 0.4; 

    std::cout << "sum: " << sum_per_id(testMapArray, "A") << '\n'; 
} 

Выход:

sum: 0.4 
+0

В этом случае testMapArray [0] [{"A", 0}] = 0,1; testMapArray [0] [{"A", 1}] = 0,1; клавиша scond переопределит первый ключ. Я думаю, он хочет, чтобы его сравнение было основано на идентификаторе и данных. – user1438832

+0

@ user1438832 Да, вы правы. Я сосредоточился на суммировании, а не на том, что может быть его реализация ключевого компаратора. Исправлена. – Galik

+0

Я нахожу это отличным подходом! – user1706047

 Смежные вопросы

  • Нет связанных вопросов^_^