Search code examples
c++sortinglinked-listlag

bottleneck c++ sort functionWi-Fi signals


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;
}

Solution

  • 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.