2010-09-01 1 views
4

У меня есть набор целых чисел stl, и я хотел бы перебирать все уникальные пары целых значений, где по уникальности я рассматриваю val1, val2 и val2, val1 как такой же, и я должен видеть только эту комбинацию раз.Как получить уникальные пары значений из набора stl

Я написал это в Python, где я использовать индекс списка (кластеров):

for i in range(len(clusters) - 1): 
    for j in range(i+1,len(clusters)): 
     #Do something with clusters[i],clusters[j]) 

, но без индекса я не знаю, как я могу достичь того же с СТЛ набор и итераторы , Я опробовал:

for (set<int>::iterator itr = myset.begin(); itr != myset.end()-1; ++itr) { 
    cout << *itr; 
} 

но это не так, поскольку итератор не имеет оператора.

Как я могу достичь этого или использовать другой контейнер?

ответ

8

Как о чем-то по следующим направлениям:

for(set<int>::const_iterator iter1 = myset.begin(); iter1 != myset.end(); ++iter1) { 
    for(set<int>::const_iterator iter2 = iter1; ++iter2 != myset.end();) { 
    { 
     std::cout << *iter1 << " " << *iter2 << "\n"; 
    } 
} 

Это дает все N*(N-1)/2 уникальные пары, где N является количество целых чисел в наборе.

В качестве альтернативы: используйте const_iterator всякий раз, когда вы перебираете контейнер без изменения чего-либо, это хороший стиль и может иметь лучшую производительность.

EDIT: Изменен код, чтобы отразить предложение, сделанное Стивом Джессопом.

+1

Хотя вопросник не говорит об этом в тексте, его код указывает, что он не хочет видеть пары, в которых значения равны. Поэтому, возможно, замените 'iter2! = Myset.end(); ++ iter2' с '++ iter2! = myset.end();' –

+0

Извиняюсь, я неправильно понял, что вы сказали. Я действительно не хочу того же значения – zenna

2

Вам не нужно делать end() - 1 так end() итератор, который указывает после последний элемент в контейнере.

Исправленный код:

for (set<int>::iterator itr = myset.begin(); itr != myset.end(); ++itr) { 
    for (set<int>::iterator itr2 = itr + 1; itr2 != myset.end(); ++itr2) { 
     // Do whatever you want with itr and itr2 
    } 
} 
+0

Малые ошибки: оба номера необходимы, а 'itr2' начинается с одного числа слишком рано. –

+0

@ Matthieu M .: Исправлено, спасибо. – ereOn

-1

Поместите свои данные в boost :: bimap, затем выполните итерацию в обоих направлениях, скопировав результаты в стандартную карту STL, которая обеспечит уникальность.