Wektory w pętli

Wektory w pętli
H1
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 5 lat
  • Postów:25
0

screenshot-20191021183019.png

Udało mi się napisać coś takiego, ale nie działa. Przyjmuję , że błędnie założyłem jak działa pętla w mainie, bo tam jest funkcja w pętli i totalnie nie rozumiem, po co powtarzać funkcję przy każdym obiegu pętli. Z góry dzięki za pomoc.
#include <vector>
#include <iostream>

Kopiuj
void intersection (std::vector<int> v1, std::vector<int> v2 )
{
int j=0;
for ( auto i = 0; i < v1.size(); ++i)
{
    if (v1[i]==v2[j]) &element=v1[i];

    else j++;


}

int main () {
for (int element: intersection(std::vector<int> {-7, 2, 3, 7, 15, 18, 23}, std::vector<int> {-8, 3, 5, 8, 15, 23, 30}))
{
std::cout << element << " ";
}
std::cout << std::endl; }

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:2 dni
  • Lokalizacja:Szczecin
2

Twoja funkcja zwraca void. Jak chcesz iterować po void?


Zobacz pozostałe 6 komentarzy
_13th_Dragon
;D sądzisz że ceratopody zaatakują?
lion137
Wygląda, że śpią, ale jak się obudzą?:-)
kq
Wtedy biada kompliatorowym oprawcom!
_13th_Dragon
@kq, to ty masz się bać, twój post poleci do kosza jako nic nie wnoszący ;D I nie istotne że ktoś już zaznaczył że post jest wartościowy, ceratopody wiedzą lepiej.
lion137
"ceratopdy", łaziło mi to po łbie, i mam skojarzenie, z cenobitami (cenobites) z Hellraiser: https://en.wikipedia.org/wiki/Hellraiser :-D
H1
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 5 lat
  • Postów:25
0

zmieniłem na int , mam błąd ||=== Build file: "no target" in "no project" (compiler: unknown) ===|
D:\UCZELNIA\3\3.2.19 Intersection.cpp||In function 'int intersection(std::vector<int>, std::vector<int>)':|
D:\UCZELNIA\3\3.2.19 Intersection.cpp|9|error: 'element' was not declared in this scope|
D:\UCZELNIA\3\3.2.19 Intersection.cpp|25|error: a function-definition is not allowed here before '{' token|
D:\UCZELNIA\3\3.2.19 Intersection.cpp|30|error: expected '}' at end of input|
||=== Build failed: 3 error(s), 0 warning(s) (0 mi

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:2 dni
  • Lokalizacja:Szczecin
0

Próbujesz naprawić metodą losowego wstawiania kodu i średnio to pomaga. Zastanów się co musi zwrócić ta funkcja, aby można było ją wykorzystać w sposób z zadania.

A w samej funkcji masz odniesienie do element, które nie ma nigdzie deklaracji.


H1
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 5 lat
  • Postów:25
0
kq napisał(a):

Próbujesz naprawić metodą losowego wstawiania kodu i średnio to pomaga. Zastanów się co musi zwrócić ta funkcja, aby można było ją wykorzystać w sposób z zadania.

A w samej funkcji masz odniesienie do element, które nie ma nigdzie deklaracji.

'
powiedz mi proszę co ma robić :
for (int element: intersection(std::vector<int> {-7, 2, 3, 7, 15, 18, 23}, std::vector<int> {-8, 3, 5, 8, 15, 23, 30}))
bo bez tego nie wiem, czego nie wiem.

edytowany 2x, ostatnio: heygo1
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:2 dni
  • Lokalizacja:Szczecin
0

Ma iterować po intersekcji (części wspólnej) wektorów.


lion137
  • Rejestracja:ponad 8 lat
  • Ostatnio:30 minut
  • Postów:4943
0

Funkcja musi zwracać wektor, czyli naiwnie:

Kopiuj
std::vector<int> intersection(std::vector<int> v1, std::vector<int> v2) {
	std::vector<int> out;
	size_t i = 0;
	for(i = 0; i < v1.size(); ++i) {
		if (contains(v1[i], v2))
			out.push_back(v1[i]);
	}
	return out;
}

Jak sobie Zaimplementujesz contains, jako wyszukiwanie binarne, to będzie O(nlog(n)), napisałem naiwnie, bo prawdopodobnie można to zrobić liniowo.


edytowany 2x, ostatnio: lion137
kq
std::set_intersection?
lion137
Czy std::set_intersection przyjmuje, jako parametr wektor? Bo jak nie, to trzeba by konwertować, co też jakiś tam czas zajmuje. Tylko, że to próżne gadanie, bo on moze korzystać tylko z std::vector.
kq
Przyjmuje parę iteratorów i iterator, albo dwie pary iteratorów. Więc jak najbardziej może korzystać z wektora. Na wejściu ma dane posortowane - nie bez powodu imo.
lion137
Rzeczywiście, i złożoność jest liniowa, on tego nie moze użyć, ale może coś podobnego napisać:)
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:14 dni
1

Ludzie, czy na prawdę nikt z was nie słyszał o valarray?
To jednowierszowe zadanie!
http://www.cplusplus.com/reference/valarray/valarray/operators/

  1. Stwórz pusty wektor wynikowy
  2. ustaw iteratory a i b na początki wektorów
  3. jeżeli jeden z iteratorów osiągnął koniec to koniec algorytmu
  4. jeżeli pierwszy element a mniejszy od pierwszego elementu b to przesuń iterator b
  5. w przeciwnym przypadku jeżeli pierwszy element a większy od pierwszego elementu b to przesuń iterator a
  6. w przeciwnym przypadku dodaj do wektora wynikowego wartość pod a (lub pod b) i przesuń oba iteratory
  7. przejdź do punktu 3.

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 4x, ostatnio: hauleth
Zobacz pozostałe 3 komentarze
kq
Teoretycznie (i to jest moja linia obrony z set_intersection) każdy nagłówek standardowy może includować każdy inny. Więc mogą być implementacje w których to działa z samym #include <vector>
_13th_Dragon
Trochę kiepska linia obrony, bo jak nie wskażesz który kompilator tak robi to trzeba będzie takowy napisać aby się obronić. A to może zająć nieco czasu.
kq
Wystarczy fork stdliba, kilka minut roboty i pół godziny kompilacji ;​)
_13th_Dragon
no w sumie racja, aczkolwiek dla @heygo1 to i tak najczarniejsza magia. Kiedyś kiedy byłem młody, zielony i głupi, poprawiłem to i owo w stdlib ... klient upgradowal kompilator i następnie wzywał mnie bo mój core nie działa - w sumie 5 razy musiałem się stawiać ... Jak mawiał Einstein: - ludzie rzadko popełniają ten sam błąd dwa razy, przeważnie trzy lub więcej!
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:około godziny
0

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
MO
  • Rejestracja:około 10 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Tam gdzie jest (centy)metro...
1

Takie własne eksploracje możliwości. Taki "nieco inny kod":

Kopiuj
#include <vector>
#include <iostream>

std::vector<int> intersect(const std::vector<int>& v1, const std::vector<int>& v2) {
    std::vector<int> result;
    for(auto it1 = v1.cbegin(), it2 = v2.cbegin();
        (it1 != v1.cend()) || (it2 != v2.cend());
        it1 += (((*it1 < *it2) && 1)) || ((*it1 == *it2) && (result.emplace_back(*it1), 1)) || ((*it1 > *it2) && (++it2, 0)));
    return result;
}

int main() {
    for(int v: intersect({-7, 2, 3, 7, 15, 18, 23}, {-8, 3, 5, 8, 15, 23, 30})) {
        std::cout << v << ' ';
    }
    std::cout << '\n';
}

Każdy problem w informatyce można rozwiązać, dodając kolejny poziom pośredniości,z wyjątkiem problemu zbyt dużej liczby warstw pośredniości — David J. Wheeler
MarekR22
X && 1 - taka sztuka dla sztuki?
MO
Nie bo zwraca 1 dla inkrementacji it1 a nie chciałem upewniać się przez rzutowanie :)
MarekR22
Ta 1 nic nie daje. Nie zmienia typu wyniku, kolejności ewaluacji itp. Dlatego napisałem sztuka dla sztuki. Wydawało mi się, że dodałeś ją tylko po to, żeby każdy element alternatywy był wyrażanie z operatorem &&.
MO
Nie każdy warunek ma &&. Bywają zwracane przez przecinek. Stwierdziłem że dobrze mieć "spójny znacznik" przy jakim warunku następuje inkrementacja a przy jakim nie. Bo ten kod daleko odbiega od standardów czytelności. Ot taki "fistaszek" :-/

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.