Strona 1 z 1

[C++]Przekazywanie wektora do funkcji.

: 31 paź 2009, 22:56
autor: pawegio
Witam,
aby przekazać wektor do funkcji używa się operatora adresu i wygląda to tak:

Kod: Zaznacz cały

funkcja(vector<int>& tab) {
        ...
}
Co jeśli chcę przekazać do funkcji tablice wektorów, np. vector<int> tab[200000] ?

1).

Kod: Zaznacz cały

funkcja(vector<int>& tab[]) {
        ...
}
2).

Kod: Zaznacz cały

funkcja(vector<vector <int>&>& tab) {
        ...
}
3).

Kod: Zaznacz cały

funkcja(vector<int>& tab[200000]) {
        ...
}
Żadna z tych trzech opcji nie działa. Jak to zaimplementować?

Odp: [C++]Przekazywanie wektora do funkcji.

: 31 paź 2009, 23:43
autor: beluosus
Priorytety operatorów kłaniają się. :)

Kod: Zaznacz cały

funkcja(vector<int> (tab)[])

Odp: [C++]Przekazywanie wektora do funkcji.

: 31 paź 2009, 23:50
autor: pawegio
Ok problem ominąłem chyba, ale dzięki za radę na przyszłość, jednak teraz pojawia się teraz inny problem. Wyskakuje to moje ulubione Segmentation fault przy takim kodzie:

Kod: Zaznacz cały

#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

int n,m,a,b;
vector<int> d[200000];
vector<int> V;

void bfsGo(int start) {
    queue<int> q;
    V[start] = 1;
    q.push(start);
    while (!q.empty()) {
        int u;
        u = q.front();
        q.pop();
        for (int i = 0; i < n; ++i)
            if (d[u][i] && !V[i]) {
                V[i] = 1;
                q.push(i);
            }
    }
}

void bfs() {
    for (int i = 0; i < n; ++i)
        if (!V[i]) {
             bfsGo(i);
        }
}

int main() {
	scanf("%d %d",&n,&m);
	V.clear(); V.resize(n,0);
	for(int i=0;i<m;i++) {
		scanf("%d %d",&a,&b);
		d[b].push_back(a);
		d[a].push_back(b);
	}

	bfs();

	return 0;
}

Odp: [C++]Przekazywanie wektora do funkcji.

: 01 lis 2009, 00:06
autor: beluosus
Nie bardzo chce mi się analizować, bo to strasznie pokręcone jest ale w tym miejscu najwyraźniej odwołujesz się do nieistniejącego elementu:

Kod: Zaznacz cały

        for (int i = 0; i < n; ++i)
            if (d[u][i] && !V[i]) {
                V[i] = 1;
                q.push(i);
            }

Odp: [C++]Przekazywanie wektora do funkcji.

: 01 lis 2009, 00:13
autor: pawegio
a jak w tym wypadku przekazać wielkość tablicy d do tej funkcji? Bo już po paru debugach widzę gdzie tkwi błąd...

EDIT: Ok, już wiem...

Odp: [C++]Przekazywanie wektora do funkcji.

: 01 lis 2009, 00:20
autor: luzakwielki
pawegio pisze:a jak w tym wypadku przekazać wielkość tablicy d do tej funkcji? Bo już po paru debugach widzę gdzie tkwi błąd...

Dać wielkość jaką może mieć, a nie pisać poza zaalokowaną pamięcią (puść debug i sprawdź jakie jest "u" i "i" w "d" i czy nie jest większe niż zaalokowałeś).

Odp: [C++]Przekazywanie wektora do funkcji.

: 02 lis 2009, 18:40
autor: pawegio
problem rozwiązany, bfs który napisałem pasowałby do tablicy dwuwymiarowej jako grafu, ale nie do tablicy wektorów, gdzie graf trochie inaczej się reprezentuje... Umnknął mi ten fakt i te dwie struktury potraktowałem jako identyczne.

Odp: [C++]Przekazywanie wektora do funkcji.

: 02 lis 2009, 23:13
autor: luzakwielki
pawegio pisze:problem rozwiązany, bfs który napisałem pasowałby do tablicy dwuwymiarowej jako grafu, ale nie do tablicy wektorów, gdzie graf trochie inaczej się reprezentuje... Umnknął mi ten fakt i te dwie struktury potraktowałem jako identyczne.
To nie dwie struktyry, a jedna (wektor z c++ to rozszerzalna tablica (gdy chcesz więcej wepchać więcej danych do tablicy niż zaalokowałeś robi realloc tablicy)).

Odp: [C++]Przekazywanie wektora do funkcji.

: 03 lis 2009, 14:25
autor: mikolajs
A nie lepiej zamiast: vector<int> d[200000];
konsekwentnie vector<vector<int> > d;