Как накапливать структуру как тип значения в мультикарте?

У меня есть мультикарта со строкой в ​​качестве ключа и Cnode struct в качестве значения:

struct Cnode
{
Cnode() : wtA(0), wtC(0), wtG(0), wtT(0) { }
Cnode(int newA, int newC, int newG, int newT)
: wtA(newA), wtC(newC), wtG(newG), wtT(newT)
{ }

int wtA, wtC, wtG, wtT;
};

Cnode combine_valuesA(const myFast map, const string& key)
{
return std::accumulate(
map.equal_range(key).first,
map.equal_range(key).second,
0,
[](int sumA, int sumC, int sumG, int sumT, myFast::value_type p) //error
{
return Cnode(
sumA + p.second.wtA,
sumC + p.second.wtC,
sumG + p.second.wtG,
sumT + p.second.wtT);
}
);
}

Мне нужно добавить все целые в Cnode для дубликатов ключей на мультикарте. Это ошибка, которую я получаю:

Нет жизнеспособного преобразования из int в Cnode

0

Решение

Это похоже на семантику, которую вы ищете:

struct Cnode
{
Cnode() : wtA(), wtC(), wtG(), wtT() { }
Cnode(int a, int c, int g, int t)
: wtA(a), wtC(c), wtG(g), wtT(t)
{ }

int wtA, wtC, wtG, wtT;
};
typedef std::multimap<std::string, Cnode> myFast;

myFast::mapped_type combine_valuesA(myFast const& map, std::string const& key)
{
auto range = map.equal_range(key);
return std::accumulate(
range.first, range.second, myFast::mapped_type(),
[](myFast::mapped_type const& node, myFast::value_type const& p)
{
return myFast::mapped_type(
node.wtA + p.second.wtA,
node.wtC + p.second.wtC,
node.wtG + p.second.wtG,
node.wtT + p.second.wtT
);
}
);
}

Обратите внимание, что Cnode может быть тривиально заменено std::valarray<int>, std::array<int, 4>, или же std::tuple<int, int, int, int> упростить код; вот как это будет выглядеть при использовании первого:

typedef std::multimap<std::string, std::valarray<int>> myFast;

myFast::mapped_type combine_valuesA(myFast const& map, std::string const& key)
{
auto range = map.equal_range(key);
return std::accumulate(
range.first, range.second, myFast::mapped_type(4),
[](myFast::mapped_type const& node, myFast::value_type const& p)
{
return node + p.second;
}
);
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]