• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Sprawdzanie pokrywania się dwóch wektorów - C++

Object Storage Arubacloud
0 głosów
443 wizyt
pytanie zadane 15 września 2022 w C i C++ przez SUOTR Początkujący (410 p.)
vector c++

Nie mam pomysłu na sprawdzenie czy dwa wektory się ze sobą pokrywają.

Dla przykładu:

a = [1, 3, 4]

b = [2, 3, 5]

odp. a i b pokrywają się

a = [3, 4, 4]

b = [2, 3, 5]

odp. a i b nie pokrywają się

Chodzi o sprawdzenie czy w obu wektorach występują te same liczby na tych samych miejscach. O ile wiem jak to wykonać z użyciem tablicy tak zastosowanie wektora sprawia mi nie mały problem.

Pozdrawiam i dziękuję za pomoc ;)

P.S Nie oczekuje odpowiedzi typu: "To użyj tablicy"
1
komentarz 15 września 2022 przez tangarr Mędrzec (154,860 p.)
Czym się różni wektor od tablicy?
komentarz 16 września 2022 przez tmar1212 Bywalec (2,600 p.)
Pokaż jak to robisz dla tablic, bo dla wektora powinno tak samo.
komentarz 16 września 2022 przez GodDoesntPlayDice Użytkownik (520 p.)
edycja 16 września 2022 przez GodDoesntPlayDice
delete - źle odczytana treść
komentarz 16 września 2022 przez TOWaD Mądrala (6,000 p.)
edycja 17 września 2022 przez TOWaD

@tmar1212, Mnie też ciekawi jako jest na tablicach, i jak wektory modą się pokrywać bez dodatkowej danej o jakieś współrzędnej danego wektora. xa/xb = ... =... = const to za mało.

edit:: ja też nie zrozumiałem treści:

Chodzi o sprawdzenie czy w obu wektorach występują te same liczby na tych samych miejscach. O ile wiem jak to wykonać z użyciem tablicy tak zastosowanie wektora sprawia mi nie mały problem.

można jak w tablicach, ale chyba std::transform jest uniwersalny do operacji na dwóch kontenerach, ale to było u MZ w kursach (chodzi mi std::cppreference)(na start rewelacja - kurs MZ- mimo podobno jakiś niedociągnięć), i u Derek Banans.

a tu taki przykład na std::equal();

******************************************************************************

                              Online C++ Compiler.
               Code, Compile, Run and Debug C++ program online.
Write your code in this editor and press "Run" button to compile and execute it.

*******************************************************************************/

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int
main ()
{
  enum { tablesize = 3 };

  int a[] = { 1, 3, 4 };
  int b[tablesize] = { 2, 3, 5 };

  std::vector < int >va (&a[0], &a[0] + sizeof (a) / sizeof (int));
  std::vector < int >vb (b, b + tablesize);
  std::vector < int >vc{2, 3, 5};

    std::cout <<std::string("1.");
  if (va.size () == vb.size ())
    std::cout<<std::boolalpha << std::equal (va.begin (), va.end (),
					       vb.begin ());
  else
    std::cout <<std::string("error");
    std::cout <<std::string("\n2.");
  if (vb.size () == vc.size ())
    std::cout << std::boolalpha << std::equal (vb.begin (), vb.end (),
					       vc.begin ())<<flush;
  else
    std::cout << std::string("error") << std::flush;

//edit 2::
  { // to też zwróci false, ale czasami może się zdarzyć, że się przekroczy zakres stosując iteratory,  
// w funkcjach STL nie wiem, bo mi się nie zdarzyło, nie mniej jednak trzeba na to uważać.
    std::vector < int >vb {2, 3, 5, 8, 13};
    std::vector < int >vc{2, 3};
    std::cout << std::string("\n3.") << std::boolalpha << std::equal (vb.begin (),
                            vb.end (),
                            vc.begin ()) << flush;
  }
  { // ale to już nie koniecznie, dlatego if (vb.size () == vc.size ())
 //   std::vector < int >vb {2, 3, 5, 8, 13};
//   std::vector < int >vc; // brak begin pewnie
 //   std::cout << std::string("\n4.") << std::boolalpha << std::equal(vb.begin (), vb.end (), vc.begin ()) << flush;
  }
  return 0;
}

// PS. edit4: Z mojego niewielkiego doświadczenia  auto też zrobiło mi psikusa, dla mnie jak STL to raczej funkcje dedykowane, a i fajny dla mnie kurs to BO QIAN

 

komentarz 18 września 2022 przez j23 Mędrzec (194,920 p.)

 std::cout <<std::string("1.");

Po co te konwersje na stringa? Przecież jest operator wyjścia dla const char*.

auto też zrobiło mi psikusa

Jakiego?

komentarz 18 września 2022 przez TOWaD Mądrala (6,000 p.)
edycja 18 września 2022 przez TOWaD

Nie wiem gdzie mam ten projekt (niedokończony :p - to jest do zestawień materiałów zakończony i użyty tylko do robienia grida w css nie :)  ).

DXF chciałem powyciągać linie i do jakieś funkcji z klasy przekazałem wektor(kopia) i we wnętrzu chciałem zrobić auto i pętla się nie kończyła. A po przekazaniu begin i end to mogłem sobie działać tak jak chciałem, ale nie pamiętam klasę chyba przekazywałem jako wskaźnik i wektor był polem w klasie.(edit:: chyba właśnie o to chodziło, że po wskaźniku na wektor i wyłuskaniu chciałem zrobić auto i nic. Begin i end zadziałał, co chyba logiczne)(edit2:: jednak działa wskaźnik na vector w prostych przypadkach, to będę musiał poszukać pendriva) (edit3: usunięte nie aktualne)

A co do const char czy jakoś tak, nie rozumiem ale wszędzie piszą że to zło wcielone, no może nie w tym przypadku.

komentarz 18 września 2022 przez j23 Mędrzec (194,920 p.)
No dokładnie, nie w tym przypadku.
komentarz 18 września 2022 przez TOWaD Mądrala (6,000 p.)
edycja 19 września 2022 przez TOWaD

Edit: Usunąłem, bo nie mam gita i linku nie mogę dać.

Nic mi nie pozostaje jak przyznać Ci znowu rację( żaden wstyd). Moja wina... :)

Ale następnym razem, a pewnie nie prędko (na razie canvasa chcę opanować), jak mi się wywali auto to na pewno napiszę na forum.

edit2:: dorzucę to co było jako jakiś przykład zastosowania iteratorów,  będzie w miarę na temat (ale to kod nie do końca idealny).

#include "../include/gridLayout.h"

gridLayout::gridLayout(std::multiset<position*,compareValue>* ptrToMsetOfPosPtr) { //:ptrToSetRow(ptrToMsetOfPosPtr)
    insertSetValueToOSS (ptrToMsetOfPosPtr);
}

gridLayout::gridLayout(std::multiset<position*,compareValue>::iterator b,std::multiset<position*,compareValue>::iterator e) { //:ptrToSetRow(ptrToMsetOfPosPtr)
    gridLayout::insertSetValueToOSS (b,e);
}
gridLayout::gridLayout(std::multiset<position*,compareValue> ToMsetOfPosPtr):ToSetRow(ToMsetOfPosPtr){
    insertSetValueToOSS (ToSetRow);
}

gridLayout::~gridLayout() {
    //dtor
}

void gridLayout::insertSetValueToOSS (std::multiset<position*,compareValue>* ptrToMsetOfPosPtr, std::string charType) {
  //  oss.fixed;
  std::cout<<"ptr tgr=/////////////////////////////////////////////////////////"<<std::endl;
    oss.precision(0);
    for(const auto & tgr: (*ptrToMsetOfPosPtr )) {
        std::cout<<"tgr="<<tgr->getValue()<<std::endl;
        oss<<tgr->getValue()<<'%'<<' ';
        return;
    }
}
void gridLayout::insertSetValueToOSS (std::multiset<position*,compareValue> ptrToMsetOfPosPtr, std::string charType) {
   // oss.fixed;
    oss.precision(0);
     std::cout<<"\nobiekt tgr=/////////////////////////////////////////////////////////"<<std::endl;
    for(const auto & tgr: ptrToMsetOfPosPtr) {
        std::cout<<"obiekt tgr="<<tgr->getValue()<<std::endl;
       // oss<<tgr<<'%'<<' ';
        return;
    }
}
void gridLayout::insertSetValueToOSS (std::multiset<position*,compareValue>::iterator b,
                                      std::multiset<position*,compareValue>::iterator e,
                                      std::string charType) {
    //oss.fixed;
     std::cout<<"\nbegin end tgr=/////////////////////////////////////////////////////////"<<std::endl;
    oss.precision(0);
    for_each(b,e, [](const auto & tgr) {
        std::cout<<"tgr="<<tgr->getValue()<<std::endl;
        // oss<<*tgr<<'%'<<' ';
        return;
    });
}

std::string gridLayout::getString () {
    templaterow+=oss.str()+";\n";
    std::cout<<std::endl<<templaterow<<std::endl;
    return templaterow;
}

i wyjaśnienie dlaczego oss jest w komentarzu

#ifndef SWAPCIN_H
#define SWAPCIN_H
#include <iostream>
#include <fstream>
#include <streambuf>

class swapcin
{
    public:
        swapcin();
        swapcin(std::string filename);
        virtual ~swapcin();

    protected:

    private:
         std::ifstream ifn;
         std::streambuf *backupin;
           bool setinputfile();
           bool setinputfile(std::string filename);
           bool beckcin ();
};
class swapcout {
public:
    swapcout();
    virtual ~swapcout();
    void changeinputfile(const std::string nameinputfile);

protected:

private:
    std::ifstream ifn;
   // std::ifstream  ifntemp;
    std::streambuf *backupin;
    std::streambuf *backupif;
    bool setinputfile();
};

#endif // SWAPCIN_H

Może i bym cały kod zrobił niestety mimo mojej miłości  do c++, tylko właściwe raz mi się przydał właśnie do obróbki DXF(ale za to jak, wykonanie zadania nie możliwego dla mnie ;) ), może jeszcze raz do obróbki CSV, no i może komuś pomogłem na tu na forum a może nie. A pisanie w jakimś języku tylko hobbistycznie, jak się nie ma czasu, to już uzależnienie.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 335 wizyt
pytanie zadane 16 stycznia 2020 w C i C++ przez AlpenGod Nowicjusz (170 p.)
0 głosów
2 odpowiedzi 2,771 wizyt
pytanie zadane 5 stycznia 2017 w C i C++ przez Ala123456 Użytkownik (760 p.)
0 głosów
1 odpowiedź 126 wizyt
pytanie zadane 9 maja 2020 w C i C++ przez nikon12s Nowicjusz (120 p.)

92,669 zapytań

141,567 odpowiedzi

320,037 komentarzy

62,034 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...