Funkcja equal

0

Witam wszystkich,
Mam taki problem: program, który przytaczam w całości, generuje kombinacje stringów(po sześć w jednej linii, razem 210 takich sześcioelementowych podzbiorów). Pierwotnie, bez tego o co mi chodzi, wygląda to tak:

ia11, ia34, ia72, ia167, ia190, ia21
ia167,ia21,ia72, ia102,ia180,ia178
...i tak dalej 210 razy

...teraz chciałbym te stringi wypełnić liczbami z wektorów, które są im przyporządkowane tak aby wyglądało to tak:

ia11, ia34, ia72, ia167, ia190, ia21
3,9,17,21,24,31,33,36,42,49, 4,8,19,22,28,30,34,39,43,47,2,6,10,13,14,25,29,37,38,46
1,6,12,15,22,27,31,32,41,42,4,7,14,17,23,30,33,36,45,48 ,2,9,13,18,21,26,34,39,44,49
3,8,11,18,22,25,36,37,43,46 ,1,6,16,17,23,28,35,40,41,44 ,2,5,12,19,24,27,31,34,42,49
3,4,12,15,21,28,32,39,47,48 ,6,9,16,17,29,30,31,38,41,42,7,8,11,20,26,27,34,35,45,46
3,10,11,14,22,23,32,35,43,44 ,6,9,16,19,24,29,37,38,45,48,2,5,13,18,25,30,31,40,41,0
2,5,16,19,25,30,34,39,45,48,1,9,12,13,21,24,33,36,44,49,3,8,15,20,23,26,35,40,43,46

ia167,ia21,ia72, ia102,ia180,ia178
...liczby...
...liczby...
…etc.

… i tak dalej dla każdej szóstki stringów.

Wiem, że potrzebne jest porównanie wszystkich stringów z sześcioelementowych kombinacji z kluczami z mapy i ponadto należy użyć funkcji ‘equal’, ale program się nie kompiluje. Wyświetla też błąd, który cytuję w komentarzu. Jeżeli ktoś byłby chętny dokładniej spojrzeć na kod, to mogę przesłać również pliki nagłówkowe.
Pozdrawiam!

#include "IndexCombination.h"
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
#include <map>
#include <sstream>



using namespace std;
using namespace stdcomb;
template<class InputIterator1, class InputIterator2>
   bool equal(
      InputIterator1 _First1, 
      InputIterator1 _Last1, 
      InputIterator2 _First2
      );
template<class InputIterator1, class InputIterator2, class BinaryPredicate>
   bool equal(
      InputIterator1 _First1, 
      InputIterator1 _Last1, 
      InputIterator2 _First2, 
      BinaryPredicate _Comp
      );
bool equal ( const string elem1, const string elem2 )
{
   return elem1 == elem2;
}
 template <class K, class V>
 class key_equals {
  private:
    K key;
  public:
    // constructor (initialize key to compare with)
    key_equals (const K& k)
     : key(k) {
    }
    // comparison
    bool operator() (pair<const K, V> elem) 
    {
        return elem.first == key;                  // sortowanie wedlug klucza
    }
  };                
int main(int argc, char* argv[])
{
   
    int ia11[30] = {3,9,17,21,24,31,33,36,42,49,
                      4,8,19,22,28,30,34,39,43,47,
                      2,6,10,13,14,25,29,37,38,46};
    int ia34[30] ={1,6,12,15,22,27,31,32,41,42
                    ,4,7,14,17,23,30,33,36,45,48
                    ,2,9,13,18,21,26,34,39,44,49};
    int ia72[30] = {3,8,11,18,22,25,36,37,43,46
                    ,1,6,16,17,23,28,35,40,41,44
                    ,2,5,12,19,24,27,31,34,42,49};
    int ia167[30] ={3,4,12,15,21,28,32,39,47,48
                     ,6,9,16,17,29,30,31,38,41,42
                     ,7,8,11,20,26,27,34,35,45,46};
    int ia190[30] = {3,10,11,14,22,23,32,35,43,44
                    ,6,9,16,19,24,29,37,38,45,48
                    ,2,5,13,18,25,30,31,40,41,0};
    int ia21[30] ={ 2,5,16,19,25,30,34,39,45,48,
                      1,9,12,13,21,24,33,36,44,49,
                      3,8,15,20,23,26,35,40,43,46};
    int ia64[30] ={6,9,13,20,28,29,33,40,43,48
                    ,2,7,16,19,24,27,31,34,44,47
                    ,5,8,14,17,21,30,32,37,41,46};
    int ia102[30] ={4,9,14,19,22,29,35,38,46,47
                     ,5,8,13,16,21,26,33,40,41,48
                     ,6,7,15,17,28,30,32,39,42,45};
    int ia178[30] ={6,9,15,20,23,24,37,38,42,45
                     ,7,8,16,19,22,25,34,39,43,46
                     ,1,2,17,18,26,29,31,40,47,0};
    int ia180[30] ={1,4,13,18,27,30,33,38,45,46
                     ,2,3,12,15,22,23,39,40,44,47
                     ,8,9,11,17,24,25,32,37,49,0};
                     
        vector<int>via11(ia11,ia11+30); //69
    vector<int>via34(ia34,ia34+30);
    vector<int>via72(ia72,ia72+30);
    vector<int>via167(ia167,ia167+30);
    vector<int>via190(ia190,ia190+30);
    vector<int>via21(ia21,ia21+30);
    vector<int>via64(ia64,ia64+30);
    vector<int>via102(ia102,ia102+30);
    vector<int>via178(ia178,ia178+30);
    vector<int>via180(ia180,ia180+30);
                                
   

        CIdxComb cb;

        cb.SetSizes(10,6);


        vector<string> vsia;
        vsia.push_back( "ia11" );
        vsia.push_back( "ia34" );
        vsia.push_back( "ia72" );
        vsia.push_back( "ia167" );
        vsia.push_back( "ia190" );
    vsia.push_back( "ia21" );
        vsia.push_back( "ia64" );
        vsia.push_back( "ia102" );
        vsia.push_back( "ia178" );
        vsia.push_back( "ia180" );
        vector<unsigned int> vi(6);

        vi[0] = 0;
        vi[1] = 1;
        vi[2] = 2;
    vi[3] = 3;
        vi[4] = 4;
        vi[5] = 5;
        cout<< vsia[ vi[0] ] << " " 
                << vsia[ vi[1] ] << " " 
                << vsia[ vi[2] ] << " "
        << vsia[ vi[3] ] << " " 
                << vsia[ vi[4] ] << " " 
                << vsia[ vi[5] ] << "\n";
        int Total = 1;
        while ( cb.GetNextComb( vi ) )
        {
            
        
                {
           
    typedef map<string,vector<int> >container;
    container::iterator Iter1;
    container map;                                 
    
     
    map.insert(make_pair("ia11", via11));
    map.insert(make_pair("ia34", via34));
    map.insert(make_pair("ia72", via72));
    map.insert(make_pair("ia167", via167));
    map.insert(make_pair("ia190", via190));
    map.insert(make_pair("ia21", via21));
    map.insert(make_pair("ia64", via64));
    map.insert(make_pair("ia102", via102));
    map.insert(make_pair("ia178", via178));
    map.insert(make_pair("ia180", via180)); 
    
    
             int get();
             string String2(ostream& get);
             ostream& get (streambuf& sb);
    
    bool b;
    b = equal(map.begin(),map.end(),String2.begin());//tu  komunikat: request for member 'begin'
    if(b)                                            //in 'String2',which is of non-class type
    std::copy(Iter1->second.begin(),Iter1->second.end(),//'std::string()(std::ostream&)'
    std::ostream_iterator<int>(std::cout,","));
    std::cout<<std::endl;
  
        
        
                             
}        
                cout<< vsia[ vi[0] ] << " " 
                        << vsia[ vi[1] ] << " " 
                        << vsia[ vi[2] ] << " " 
                    << vsia[ vi[3] ] << " " 
                        << vsia[ vi[4] ] << " " 
                        << vsia[ vi[5] ] << endl; 
                ++Total;
                
        }

        cout<< "\nTotal : " << Total << endl;
        
        system( "pause" );
        return 0;
}
0
while ( cb.GetNextComb( vi ) )
{
	...
	int get();
	string String2(ostream& get);
	ostream& get (streambuf& sb);
	...
}

A ten fragment kodu to co to ma być?

0

Już dokładnie nie pamiętam, ale chyba próbowałem zrobić multimapę ze String2 jako kluczami, a watrością miały być stringi z mapy i tak jakoś się przyplątało. Tak czy inaczej, problem pozostaje. Trzeba jakoś te generowane przez program w swojej czystej postaci sześcioelementowe kombinacje stringów zasugerować kompilatorowi, bo chyba tego właśnie się czepia w miejscu "String2.begin()" .

Pozdro!

0

Czepia się, bo twierdzi, że String2 nie jest klasą, czyli coś nie tak z deklaracją. Nawet zakładając, że poprawiłeś to co wskazałem, to i tak wywołanie equal nie przejdzie - brak przedykatu, który będzie wstanie porównać zawartość iteratora mapy (pair<string,vector<int>>) z zawartością iteratora stringa (char).

TU sobie zajrzyj.

0
             int get();
             string String2(ostream& get);
             ostream& get (streambuf& sb);

To są deklaracje funkcji. Poknociłeś.

Poza tym kilka uwag:

  1. Jeśli masz liczby w zwykłej tablicy nie przerzucaj ich do wektora, skoro i tak nie korzystasz z dodatkowych rzeczy jakie oferuje. W ogóle nigdzie ich nie przerzucaj tylko korzystaj z pierwotnej tablicy i odpowiednio wyliczonych indeksów.
  2. Skoro liczby są stałe i znane podczas kompilacji to zdefiniuj sobie od razu łańcuchy z nich zrobione, zaoszczędzisz.
  3. Nie składaj osobnych tablic/map/wektorów dla każdej z kombinacji. Korzystaj cały czas z jednej pierwotnej tablicy wybierając odpowiednie elementy.
  4. KISS

Widzę to mniej więcej tak:

struct Element
{
   char nazwa[6];
   int liczby[30]; // możesz się pozbyć całkowicie tej tablicy jeśli jej nie potrzebujesz
   char lancuch[90];
};

const Element elementy[] = {
   {
      "ia11",
      {3,9,17,21,24,31,33,36,42,49,4,8,19,22,28,30,34,39,43,47,2,6,10,13,14,25,29,37,38,46},
      "3,9,17,21,24,31,33,36,42,49,4,8,19,22,28,30,34,39,43,47,2,6,10,13,14,25,29,37,38,46" 
   }, {
      "ia34",
      {1,6,12,15,22,27,31,32,41,42,4,7,14,17,23,30,33,36,45,48,2,9,13,18,21,26,34,39,44,49},
      "1,6,12,15,22,27,31,32,41,42,4,7,14,17,23,30,33,36,45,48,2,9,13,18,21,26,34,39,44,49"
   }, {
      "ia72",
       {3,8,11,18,22,25,36,37,43,46,1,6,16,17,23,28,35,40,41,44,2,5,12,19,24,27,31,34,42,49},
      "3,8,11,18,22,25,36,37,43,46,1,6,16,17,23,28,35,40,41,44,2,5,12,19,24,27,31,34,42,49"
   }, {
      "ia167",
      {3,4,12,15,21,28,32,39,47,48,6,9,16,17,29,30,31,38,41,42,7,8,11,20,26,27,34,35,45,46},
      "3,4,12,15,21,28,32,39,47,48,6,9,16,17,29,30,31,38,41,42,7,8,11,20,26,27,34,35,45,46"
   }, {
      "ia190",
       {3,10,11,14,22,23,32,35,43,44,6,9,16,19,24,29,37,38,45,48,2,5,13,18,25,30,31,40,41,0},
      "3,10,11,14,22,23,32,35,43,44,6,9,16,19,24,29,37,38,45,48,2,5,13,18,25,30,31,40,41,0"
   }, {
      "ia21",
      {2,5,16,19,25,30,34,39,45,48,1,9,12,13,21,24,33,36,44,49,3,8,15,20,23,26,35,40,43,46},
      "2,5,16,19,25,30,34,39,45,48,1,9,12,13,21,24,33,36,44,49,3,8,15,20,23,26,35,40,43,46"
   }, {
      "ia64",
      {6,9,13,20,28,29,33,40,43,48,2,7,16,19,24,27,31,34,44,47,5,8,14,17,21,30,32,37,41,46},
      "6,9,13,20,28,29,33,40,43,48,2,7,16,19,24,27,31,34,44,47,5,8,14,17,21,30,32,37,41,46"
   }, {
      "ia102",
      {4,9,14,19,22,29,35,38,46,47,5,8,13,16,21,26,33,40,41,48,6,7,15,17,28,30,32,39,42,45},
      "4,9,14,19,22,29,35,38,46,47,5,8,13,16,21,26,33,40,41,48,6,7,15,17,28,30,32,39,42,45"
   }, {
      "ia178",
      {6,9,15,20,23,24,37,38,42,45,7,8,16,19,22,25,34,39,43,46,1,2,17,18,26,29,31,40,47,0},
      "6,9,15,20,23,24,37,38,42,45,7,8,16,19,22,25,34,39,43,46,1,2,17,18,26,29,31,40,47,0"
   }, {
      "ia180",
      {1,4,13,18,27,30,33,38,45,46,2,3,12,15,22,23,39,40,44,47,8,9,11,17,24,25,32,37,49,0},
      "1,4,13,18,27,30,33,38,45,46,2,3,12,15,22,23,39,40,44,47,8,9,11,17,24,25,32,37,49,0"
   }
};

int main()
{
   CIdxComb cb;
   cb.SetSizes(10, 6);

   vector<int> kombinacja(6);
   kombinacja[0] = 0;
   kombinacja[1] = 1;
   kombinacja[2] = 2;
   kombinacja[3] = 3;
   kombinacja[4] = 4;
   kombinacja[5] = 5;

   int Total = 0;

   while(cb.GetNextComb(kombinacja))
   {
      Total++;
      cout << "Kombinacja nr. " << Total << endl;

      for (unsigned i = 0; i < kombinacja.size(); i++)
      {
         const Element &element = elementy[kombinacja[i]];
         cout << element.nazwa << ": " << element.lancuch << endl;
      }

      cout << endl;
   }
}
0

Do adf88!
Masz całkowitą rację, przejscie z tablic na wektory to efekt mojego lenistwa i nie tylko. W mojej opinii jesteś bardzo dobry w tej materii. Jeśli znajdziesz troche czasu napisz pod gg 13248028 lub [email protected]. Za ewentualną pomoc chciałbym sie odwdzięczyć czymś wiecej niż "serdecznym Bóg zapłać", ale to forum nie nadaje sie do dyskusji na te tematy. Zarazem muszę przeprosić, że jestem taki zdawkowy, mam po prostu mało czasu. Jestem zawalony robotą. Muszę na jutro zrobić niewielką prezentację w Power Poincie. Materiały już mam - teraz tylko tłumaczenie z angielskiego, parę ozdobników, ale i tak może się zejść do północy, więc przepraszam, że nic nie piszę o Twoich propozycjach do programu, który klecę. Pozdrawiam i czekam na sygnał!

0

Witam po dwóch dniach,
Niby fajny pomysł z tymi tablicami, ale nie chce zagrać...
Z początku kompilator nie rozpoznawał w ogóle
CIdxComb cb;

Po dodaniu:
using namespace stdcomb;

zatrzymuje się odrobinkę dalej w linijce z pętlą while
cytuję:
vector<int> kombinacja(6);
kombinacja[0] = 0;
kombinacja[1] = 1;
kombinacja[2] = 2;
kombinacja[3] = 3;
kombinacja[4] = 4;
kombinacja[5] = 5;

int Total = 0;
while(cb.GetNextComb(kombinacja))// właśnie tu
... i mówi,że nie ma funkcji pasującej do wywołania. Ze strukturami miałem raczej mało do czynienia i nie wiem jak zdefiniować zakresy przed nimi. Może ktoś coś poradzi, bo już mi sie nie chce w tym grzebać.

0

Witojcie !
Po kilku dniach rozważań doszedłem do wniosku, że nie muszę nic kombinować ze strukturami, ani zakresami.
Wydaje mi się, że GetNextComb powinno być dodane do definicji CIdxComb(to jest ta brakująca funkcja, co zresztą sugeruje kompilator ), ale jak to zrobić praktycznie, aby znów nie pojawiły sie jakieś niezgodności? Czy ma ktoś jakiś pomysł?
A swoja drogą, to problem ten jak widzę wcale nie jest taki łatwy, skoro tyle osób zajrzało, a tylko dwie ograniczyły się do praktycznych uwag i propozycji. Coś kiepsko z Wami, kochani. Mimo to, nie tracę nadzieji.
Pozdrawiam !

0

Przecież to ty sam wyjechałeś z bliżej nieokreślonymi CIdxComb i GetNextComb w swoim pierwszym poście więc każdy założył, że wiesz co to i jak używać więc już nie tykał.
Wszystko już masz, pozostaje wygenerować indeksy kolejnych kombinacji.

0

Święta racja,
wyjechałem ...bo one są w plikach nagłówkowych, ale po Twoich propozycjach ze strukturą i łańcuchami
kompilator wyczynia cuda, nie rozpoznaje funkcji, a przy tym nie daje ich czasami nawet zadeklarować, korzysta z tych plików jakby tylko w części i kiedy mu to odpowiada. Wygląda na to, że chyba się wszystko posypało, więc może zacytuję te pliki dla absolutnej jasności:

#include "IndexCombination.h"

using namespace stdcomb;

void CIdxComb::Init( unsigned int SetSize, unsigned int CombSize )
{

if( CombSize == 0 )
	CombSize = 1;

m_ArrSize = CombSize;
m_LastIdx = CombSize - 1;


if( SetSize == 0 )
	SetSize = 2;

if( CombSize > SetSize )
	CombSize = SetSize;

m_SetSize = SetSize;
m_LastSetIdx = SetSize - 1;

}

bool CIdxComb::SetSizes( unsigned int SetSize, unsigned int CombSize )
{
if( SetSize == 0 )
return false;

if( CombSize == 0 )
	return false;

if( CombSize > SetSize )
	return false;

m_ArrSize = CombSize;
m_LastIdx = CombSize - 1;

m_SetSize = SetSize;
m_LastSetIdx = SetSize - 1;

return true;

}

bool CIdxComb::GetNextComb( std::vector<unsigned int="int"> &vi )
{

if( vi[m_LastIdx] == m_LastSetIdx )
{
	if( m_ArrSize == 1 ) 
		return false;		
	bool Completed = true;
	
	unsigned int IncompIdx = m_LastIdx - 1; 
	
	bool FirstIdx = false;
	unsigned int ArrIdx = m_LastIdx - 1;

	unsigned int SetIdx = m_LastSetIdx - 1;
	
	while( !FirstIdx )
	{
		if( vi[ArrIdx] != SetIdx )
		{
			Completed = false;
			IncompIdx = vi[ArrIdx] + 1;
			break;
		}

		if( SetIdx )
			--SetIdx;
	
		if( !ArrIdx )
			FirstIdx = true;
		else
			--ArrIdx; 
			 
	}

	if( Completed )
		return false;
	else
	{
		for( unsigned int i=ArrIdx; i<=m_LastIdx; ++i, ++IncompIdx )
		{
			vi[i] = IncompIdx;
		}
	}

}
else if ( vi[m_LastIdx] < m_LastSetIdx )
{
	(vi[m_LastIdx])++;
}
else 
{
	return false;
} 

return true;

}

Oraz klasa CIdxComb

//Index Combination.h
#include <vector>

#ifndef INDEXCOMBINATION_H
#define INDEXCOMBINATION_H

namespace stdcomb
{

class CIdxComb
{
public:
//Konstruktor
CIdxComb()
{
Init( 2, 1 );
};

CIdxComb( unsigned int SetSize, unsigned int CombSize )
{
	Init( SetSize, CombSize ); 
};


// Destruktor
~CIdxComb() {};


void Init( unsigned int SetSize, unsigned int CombSize );

bool SetSizes( unsigned int SetSize, unsigned int CombSize );

bool GetNextComb( std::vector<unsigned int> &vi );

protected:
unsigned int m_ArrSize;
unsigned int m_LastIdx;

unsigned int m_SetSize;
unsigned int m_LastSetIdx;

};

}
#endif // INDEXCOMBINATION_H
#include <vector>

I to by było na razie na tyle, więc kłaniam się nisko z berecikiem w łapce! </i>

0

zatrzymuje się odrobinkę dalej w linijce z pętlą while
cytuję:

   vector<int> kombinacja(6);
   kombinacja[0] = 0;
   kombinacja[1] = 1;
   kombinacja[2] = 2;
   kombinacja[3] = 3;
   kombinacja[4] = 4;
   kombinacja[5] = 5;

   int Total = 0;
   while(cb.GetNextComb(kombinacja))// właśnie tu

... i mówi,że nie ma funkcji pasującej do wywołania.

No bo nie ma dla vector<int>, ale jest dla vector<unsigned int>. Wniosku nie muszę (chyba) pisać, bo nasuwa się sam ;)

0

Ja nie mogę,
taki dupersztyk, a tyle czasu straciłem. Jesteś wielki!!! Zawsze co dwie głowy to nie jedna.
Gdybyś potrzebował jakieś tłumaczenie z takich języków jak angielski, czeski, słowacki lub rosyjski to wal jak w dym. Nie muszą koniecznie dotyczyć programowania. Tłumaczenia to moja prawdziwa profesja.
Programowaniem zajmuję sie w wolnych chwilach, czyli po prostu z doskoku. Takie hobby.
Jeszcze raz wielkie dzięki!
Serdecznie pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1