Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[c++] vector struktur: wyszukanie tych samych łańcuchów pól struktur

Ostatnio zmodyfikowano 2014-02-11 11:20
Autor Wiadomość
Kefirek
Temat założony przez niniejszego użytkownika
» 2014-02-10 15:24:44
C/C++
vector < klient >::iterator iter;
for( l = 0; l < vektor8.size(); l++ )
     iter = find( vektor8.begin(), vektor8.end(), vektor8[ l ].nazwa ); // nazwa pole struktury w wektorze

if( iter != vektor8.end() )

Błąd : error C2678: dwuargumentowy "==" : nie znaleziono żadnego operatora, który przyjmuje lewostronny operand typu "klient" (lub nie istnieje akceptowalna konwersja)
P-104379
Kefirek
Temat założony przez niniejszego użytkownika
» 2014-02-10 15:39:48
.....chyba wynika z tego, że funkcją find() i umieszczonym w niej elementem struktury(pole char nazwa[30]) w wektorze, jako jeden z argumentów nie da się tego wykonać, a może nie ???.
W takim razie proszę o pomoc w rozwiązaniu tego zadania. Z pozoru wydaje się łatwe, ale tak jak pisałem spędziłem już parę dni i już się zapętliłem w opcjach sposobu znalezienia rozwiązania.
Pozdrawiam
Kefirek
P-104382
Monika90
» 2014-02-10 19:22:12
Tu masz pseudokod
C/C++
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>

struct Client
{
    std::string name;
    double x, y;
};

struct ByName
{
    template < class T >
    bool operator ()( const T & x, const T & y ) const { return x.name < y.name; }
};

int main()
{
    std::vector < Client > clients = { { "John", 1.2, 3.4 }, { "John", 2.2, - 3.4 }, { "Jesus", 0, 0 }, { "Matt", 5, 4 }, { "Matt", 4, 5 } };
    std::vector < Client > accumulated;
    std::sort( clients.begin(), clients.end(), ByName() );
    auto i = clients.begin();
    while( i < clients.end() )
    {
        auto j = std::upper_bound( i, clients.end(), * i, ByName() );
        accumulated.push_back( * i );
        ++i;
        while( i < j )
        {
            accumulated.back().x += i->x;
            accumulated.back().y += i->y;
            ++i;
        }
    }
   
    for( const auto & c: accumulated )
         std::cout << c.name << ' ' << c.x << ' ' << c.y << std::endl;
   
}
I żebyś nie mówił, że mój pseudokod nie działa, tu dowód że działa
http:/​/coliru.stacked-crooked.com/a​/2dd5e6e6dc3f6731
P-104391
Kefirek
Temat założony przez niniejszego użytkownika
» 2014-02-10 21:04:36
Dziękuje za włożony przez Ciebie wysiłek(swoją drogą jestem ciekaw ile Ci to zajęło?).. ale to nie jest takie ważne.
Ten kod wygląda powiedziałbym niestandardowo(nie są to słowa krytyki).

I żebyś nie mówił, że mój pseudokod nie działa, tu dowód że działa.
Dziwi mnie trochę Twoja  powyższa wypowiedź bo akurat Ciebie uważam za najlepszą pomoc na tym forum. To w dużym stopniu dzięki Tobie program, który pisze jest w 80% ukończony. Potrafiłaś mi pomóc w kluczowych momentach gdy zapętliłem się w np
zapisie i odczycie danych z plików binarnych itd.
Co do Twojego rozwiązania:
Zastanawiam się czy jest jakiś inny sposób rozwiązania tego zadania(prostszy bez pseudokodu  np:

C/C++
for( j = 0; j < vektor8.size(); j++ )
{ tempi++;
   
    for( i = tempi; i < vektor8.size(); i++ )
    {
        if( strcmp( vektor8[ j ].nazwa, vektor8[ i ].nazwa ) == 0 )
        {
            vektor8[ j ].kg += vektor8[ i ].kg; // sumowanie pól struktury kg
            vektor8[ j ].koszt += vektor8[ i ].koszt; // sumowanie pól struktury koszt
            vektor9.push_back( vektor8[ j ] );
           
        }
        if( strcmp( vektor8[ j ].nazwa, vektor8[ i ].nazwa ) != 0 ) //warunek już jest
        tu utkn ą ł em....jak wyci ą gn ą ć z wektora ł a ń cuchy wyst ę puj ą ce tylko raz i zapisa ć je do vektor9
    }
   
}


Pozdrawiam
Kefirek
P-104399
Monika90
» 2014-02-10 22:11:19
Zajęło mi to może kwadrans. Ten kod to kwintesencja prostoty. Jest to jak najbardziej zalecany i typowy sposób pisania programów. Jeżeli dla Ciebie wygląda niestandardowo, to znaczy że nie miałeś dotąd doczynienia ze współczesnym C++.


Zastanawiam się czy jest jakiś inny sposób rozwiązania tego zadania
Jeżeli i tak sprawdzasz wszystkie elementy w pętli, to możesz sobie policzyć ile było tych z bieżacą nazwą i jeżeli był tylko jeden to dodać go do vektor9

C/C++
for( j = 0; j < vektor8.size(); j++ )
{ tempi++;
   
    int count = 1;
    for( i = tempi; i < vektor8.size(); i++ )
    {
        if( strcmp( vektor8[ j ].nazwa, vektor8[ i ].nazwa ) == 0 )
        {
            vektor8[ j ].kg += vektor8[ i ].kg; // sumowanie pól struktury kg
            vektor8[ j ].koszt += vektor8[ i ].koszt; // sumowanie pól struktury koszt
            vektor9.push_back( vektor8[ j ] );
            ++count;
        }
    }
   
    if( count == 1 ) //był tylko jeden, więc dodaj
         vektor9.push_back( vektor8[ i ] ) );
   
}
Z tym że wygląda na to, że twój kod będzie wielokrotnie sumował te elementy które wystepują więcej niż raz.
P-104404
Kefirek
Temat założony przez niniejszego użytkownika
» 2014-02-10 22:40:08
Dzięki. Niestety tak jak napisałaś ten kod nie spełnia moich założeń.
Pomyśle jeszcze nad innym rozwiązaniem. Spróbuje ułożyć jakiś algorytm może się uda.
Pozdrawiam
Kefirek
P-104406
Monika90
» 2014-02-10 23:31:49
Algorytm użyty w moim zamieszczonym wyżej kompilowalnym pseudokodzie jest prosty:
Posortuj wektor wg nazw, dzięki temu elementy o tej samej nazwie będą koło siebie.
Potem, dla każdego zakresu elementów o tej samej nazwie, weź z niego pierwszy element, wstaw do wektora, dodaj do niego wartości z reszty elementów tego zakresu. Przejdź do następnego zakresu i tak dalej...

Ale można też tak:
C/C++
#include <map>
#include <vector>
#include <string>
#include <iostream>

struct Client
{
    std::string name;
    double x, y;
};

int main()
{
    std::vector < Client > clients = { { "John", 1.2, 3.4 }, { "John", 2.2, - 3.4 }, { "Jesus", 0, 0 }, { "Matt", 5, 4 }, { "Matt", 4, 5 } };
    std::map < std::string, Client > accumulated;
    for( const auto & c: clients )
    {
        auto & a = accumulated[ c.name ];
        a.x += c.x;
        a.y += c.y;
    }
   
    for( const auto & c: accumulated )
         std::cout << c.first << ' ' << c.second.x << ' ' << c.second.y << std::endl;
   
}
P-104407
Kefirek
Temat założony przez niniejszego użytkownika
» 2014-02-11 08:10:14
Tak rzeczywiście jest prosty.
Nadal jednak mnie nurtuje czy da się rozwiązać to zadanie układając algorytm wykorzystujący(prosty język C++ a , nie tak współczesny) ze
zwykłym if, i stosując indeksy(liczniki) elementów, oraz  proste zmienne pomocnicze.....dlatego jeszcze popróbuje.

Pozdrawiam
Kefirek
P-104412
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona