Jak iterator może wskazywać na inny iterator, albo mieć ten sam indeks?

0

Cześć,
od pewnego czasu dziwię się, dlaczego jeden iterator nie może wskazywać na inny. Przecież to są wskaźniki? Załóżmy mamy coś takiego:

for (it = v.begin(); it != v.end(); ++it) {
	//...
	for (it2 = it + 1; it2 != v.end(); ++it2) //it2 ma indeks it + 1?
		//...
}

to nie działa. Nie mam pojęcia czemu. próbowałem z std::advance(), ale marnie mi to idzie. Są jakieś sposoby na to, żeby drugi iterator posiadał ten sam indeks co pierwszy?
Pozdro

2

To nie są wskaźniki, ale klasy umiejące indeksować wnętrze pojemników.

0

@MasterBLB: No dobra, ale czy iterator może mieć indeks innego iteratora?

1
    std::vector<int> v{ 1,2,3,4,5,6 };
	for (auto it = v.begin(); it != v.end(); ++it) {
		for (auto it2 = it + 1; it2 != v.end(); ++it2) {
			std::cout << *it2 << ' ';
		}
		std::cout << '\n';
	}

https://wandbox.org/permlink/2Sz2q2NygA0gke3h

1

czy iterator może mieć indeks innego iteratora?

Tak ale nie każdy "potrafi" it + 1.
http://www.cplusplus.com/reference/iterator/

próbowałem z std::advance(), ale marnie mi to idzie.

Może z std::next() będzie lepiej.

0

Dzięki za wskazówki, ale niestety użycie zarówno std::next() i auto odpada, bo kod musi być zgodny ze standardem 98 :( sory ze wcześniej tego nie dodałem.

1

To podaj typ jawnie

    for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
		for (std::vector<int>::iterator it2 = it + 1; it2 != v.end(); ++it2) {
			std::cout << *it2 << ' ';
		}
		std::cout << '\n';
	}

Ważne, żeby oba iteratory byly tego samego typu.

1

Może lepiej podaj więcej kodu (najlepiej MCVE), bo mam wątpliwości cz cię dobrze rozumiemy, szczególnie, że źle używasz terminologii (np "drugi iterator posiadał ten sam indeks co pierwszy").
Albo jeszcze lepiej opisz jaki problem ma rozwiązywać twój kod, bo może to jest problem XY.

0

no teraz to już mam mindfuck... wracam następnego dnia do kodu, kopiuję go aby wrzucić na forum usuwając jakieś drobne fakapy i co? nagle magicznie drugi iterator zaczął działać! Wcześniej rzucało mi w miejscu drugiej pętli wyjątek, ale nie pamiętam treści (debugger pokazywał wartość it2 jako (???)).

void sel_sort(std::vector<int> &V) {
	//edit: usunąłem nieużywaną zmienną
	std::vector<int>::iterator it;
	std::vector<int>::iterator it2;
	for (it = V.begin(); it != V.end() - 1; ++it) {
		std::vector<int>::iterator smallest = it; // smallest ma indeks it?
		for (it2 = it + 1; it2 < V.end() - 1; ++it2) // wcześniej tu rzucało wyjątek it2 = (???), a teraz już nie...
			if (*it2 < *smallest) //jeżeli wartość spod it2 jest mniejsza niż.. wartość spod smallest, której nie ma?
				*smallest = *it2;

		std::swap(*it2, *smallest);
	}
}

Teraz się kompiluje, wow. Tylko, że błędnie, jak zwykle. Nie wiem jak uzyskać aktualny indeks iteratora, aby potem w std::swap zamienić miejscami iterator :v

0

Ten kod jest nieprawidłowy (ostatni element zostanie na swoim miejscu)!
Poza tym, dziel problemy na mniejsze, to łatwiej ci będzie ogarnąć kod:

typedef std::vector<int>::iterator VecIter;

VecIter minimumElement(VecIter b, VecIter e) {
    VecIter r = b;
    while (b != e) {
         if (b* < *r) r = b;
         ++b;
    }
    return r;
}

void sel_sort(std::vector<int> &v)
{
    for (VecIter it = v.begin(); it != v.end() - 1; ++it) {
         std::iter_swap(it, minimumElement(it, v.end()));
    } 
}
0

Dzięki za pomoc. Mam jeszcze jedno małe pytanko: jak z tym uzyskiwaniem indeksu iteratora? w ANSI C w pętli to po prostu jakaś zmienna np. int i, ale nie mam bladego pojęcia jaka zmienna powinna przechowywać aktualny indeks danego iteratora. powinien to być sam int, czy może std::vector<int>::iterator?

0

Iterator nie ma indeksu! Jeśli chodzi ci o indeks elementu wektora, na który wskazuje iterator, to:

auto index = std::distance(std::begin(), it);

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