Wektory w pętli

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>

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; }

2

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

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

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.

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.

0

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

0

Funkcja musi zwracać wektor, czyli naiwnie:

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.

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.
1

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

#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';
}

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