Currently I am making a program in which I estimate WiFi device coordinates by using the RSSI. The program contains a bottleneck.
I have tried replacing the string comparison with other functions. That didn
The full function:
std::list<std::list<wSignal*>> SignalGrouper::groupByMac (std::list<wSignal*> signals)
{
std::list<std::list<wSignal*>> groupedSignals;
std::list<wSignal*> doneSignals;
for (std::list<wSignal*>::iterator it1=signals.begin(); it1 != signals.end(); ++it1) //take first signal
{
if(DoesSignalExist(doneSignals, *it1) == false) //check if signal is already been grouped
{
std::list<wSignal*> group;
for (std::list<wSignal*>::iterator it2=signals.begin(); it2 != signals.end(); ++it2)
{
if(DoesSignalExist(doneSignals, *it2) == false)
{
if(boost::iequals((*it2)->MAC, (*it1)->MAC))
{
group.push_back(*it2);
doneSignals.push_back(*it2);
}
}
}
groupedSignals.push_back(group);
}
}
return groupedSignals;
}
Has it to be a std::list to be returned? Otherwise you could reduce the iterating steps by using a std::map like this:
std::map<MAC, std::list<wSignal*>> SignalGrouper::groupByMac (std::list<wSignal*> signals)
{
std::map<MAC, std::list<wSignal*>> groupedSignals;
for (std::list<wSignal*>::iterator it1 = signals.begin(); it1 != signals.end(); ++it1) //take first signal
{
std::map<MAC, std::list<wSignal*>>::iterator it2 = groupedSignals.find((*it1)->MAC);
if(it2 != groupedSignals.end()) {
it->second.push_back(*it1);
} else {
groupedSignals[(*it1)->MAC] = (*it1);
}
}
return groupedSignals;
}
Not tested, but should work something like that.