2012-06-27 3 views
-4

Я пытаюсь создать комбинацию графов графа, которые хранятся внутри вектора. Мне нужно сгенерировать AND и сохранить сгенерированные векторы в векторе. Ниже я сделал то, что я сделал до сих пор, но сейчас он не компилируется;Создание перестановки векторов в C++

#include <stdlib.h> 
#include<iostream> 
#include<vector> 
#include<algorithm> 

struct edge{ 

int a; 
int b; 
int weight; 
edge(int u,int v,int cost) 
{ 
    a=u; 
    b=v; 
    weight=cost; 
} 

}; 


int main() 
{ 
    typedef std::vector<edge> V; //<or_any_class> 
    V v; 

    v.push_back(1,2,10); 
    v.push_back(1,3,10); 
    v.push_back(1,4,10); 
    v.push_back(3,4,10); 
    v.push_back(3,5,10); 
    v.push_back(3,5,10); 

    do{ 
     std::cout<<v[0]<<" "<<v[1]<<" "<<v[2]<<" "<<v[3]<<" "<<v[4]<<std::endl; 
    } 

    while(std::next_permutation(v.begin(),v.end())); 
return 0; 
} 

What Im trying to get as output; 

1 2 
1 3 
1 4 
3 4 
3 5 
4 3 
1 2 1 3 
1 2 1 4 

Любые подсказки?

+1

Какая ошибка компилятора? –

+0

нет совпадений для 'operator <' in ..... –

+1

@AmaarBokhari: Пожалуйста, предоставьте ошибки в разумном количестве деталей. Говорить «он не компилируется» не помогает никому! – Rook

ответ

7

Ошибка один:

v.push_back(1,2,10); 

должен быть

v.push_back(edge(1,2,10)); 
      ^^^^ 

Ошибка два:

Вам нужно определить operator << для edge класса, так что std::cout<<v[0] может составить

std::ostream& operator << (std::ostream& o, const edge& e) 
{ 
    return o << e.a << " " << e.b << " " << e.weight; 
} 

Ошибка три:

Вам нужно определить operator < для egde класса, так что std::next_permutation(v.begin(),v.end()) может скомпилировать и работать

bool operator < (const edge& e1, const edge& e2) 
{ 
    if(e1.a != e2.a) return e1.a < e2.a; 
    if(e1.b != e2.b) return e1.b < e2.b; 
    return e1.weight < e2.weight; 
} 
+0

спасибо! после исправления, он все еще дает ошибку компиляции. –

+1

@Amaar: Вы видели мое редактирование? Если да, то какая ошибка компилятора вы получаете? –

+0

почему -minus голосовать? –

3

Это:

v.push_back(1,2,10); 

должно быть:

v.push_back(edge(1,2,10)); 
+1

или 'v.push_back ({1,2,10});' в C++ 11. Как это круто? :) – jrok

+0

@jrok, очень приятно. – hmjd

+0

@jrok: Cooler: 'v.emplace_back (1,2,10);' –

Смежные вопросы