Как добраться до элементов в std::set два на два в C++

У меня есть список целых чисел.(В настоящее время хранится в std::vector, но для повышения эффективности мне нужно преобразовать его в набор. Но в текущей версии я использую его следующим образом: (Я использую C++98 не C++11)

int res=0;
vector<vector<int> >costMatrix;
vector<int>partialSolution;
    for(int i =0;i<partialSolution.size()-1;i++){
        res+=costMatrix[partialSolution.get(i)][partialSolution.get(i+1)];
    }

Итак, мне нужно сделать то же самое с заданной структурой данных. Но я не знаю, как получить два элемента из набора одновременно. Я могу получить partialSolution.get(i) с кодом ниже, но я не мог получить partialSolution.get(i+1), Есть ли кто-нибудь, чтобы помочь мне изменить код ниже?

 // this time set<int> partialSolution
    int res=0;
    std::set<int>::iterator it;
    for (it = partialSolution.begin(); it != partialSolution.end(); ++it)
{
    res+=costMatrix[*it][]; 
}

1 ответ

Это может сработать begin() в end()-1 и используя std::next или же ++ чтобы получить элемент рядом с текущим).

В C++11:

for (it = partialSolution.begin(); it != std::prev(partialSolution.end()); ++it)
{
    res+=costMatrix[*it][*(std::next(it))]; 
}

В C++98:

std::set<int>::iterator last = partialSolution.end();
--last;
for (it = partialSolution.begin(); it != last; ++it)
{
    // not optimal but I'm trying to make it easy to understand...
    std::set<int>::iterator next = it;
    ++next;
    res+=costMatrix[*it][*next]; 
}
Другие вопросы по тегам