Как добраться до элементов в 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];
}