2016-01-15 3 views
-1

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

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][]; 
} 
+3

«В настоящее время хранится в' станд :: VECTOR', но для повышения эффективности, мне нужно, чтобы преобразовать его на 'std:; set'" - это вряд ли улучшит производительность, 'std :: set' очень неаккуратно. – BoBTFish

+0

В другом месте моего кода я ищу, содержит ли мой вектор определенный номер или нет. На самом деле я должен изменить эту часть. Но чтобы изменить это, я должен изменить часть, упомянутую выше. @BoBTFish – zwlayer

+0

- целые числа, отсортированные в 'partialSolution'? –

ответ

2

Это может работать (итерация от 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]; 
} 
+1

это C++ 11, OP запросил C++ 98 – Slava

+0

@Slava: true, исправлено это ... – jpo38

+0

Я думаю, что C++ 11 может быть лучше с 'std: accumulate', но, возможно, нет. – erip