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

Vector c++ a tablica 2-wymiary

VPS Starter Arubacloud
0 głosów
871 wizyt
pytanie zadane 22 kwietnia 2017 w C i C++ przez Barteck125 Obywatel (1,120 p.)

Witam utworzyłem sobie vector dwuwymiarowy:

int CreateVector(int wierzcholki) {

	vector < vector <int> > mac;
	int i, j;
	mac.resize(wierzcholki);
	for (i = 0; i<mac.size(); i++)
		mac[i].resize(wierzcholki);

Moje pytanie jest czy moge jakoś zwrócić ten vector jako inta abym mógł go później użyć w funkcji, która wcześniej była napisana pod tablice dwuwymiarową:(chce go użyć w miejsce tej tablicy dwuwymiarowej)

ReadFromFile(s_nazwaPliku, firstFromPair, secendFromPair, GraphMatrix);

Gdzie GraphMatrix to zrobiona tablica dwuwymiarowa za pomocą funkcji i zwrócona jako int.

komentarz 22 kwietnia 2017 przez draghan VIP (106,230 p.)

Gdzie GraphMatrix to zrobiona tablica dwuwymiarowa za pomocą funkcji i zwrócona jako int.

Jak zwrócona? Pokaż typ GraphMatrix.

komentarz 22 kwietnia 2017 przez Barteck125 Obywatel (1,120 p.)
//GraphMatrix = CreateMatrix(Vertices);
//////////////////////////////////////////////

int **CreateMatrix(int wierzcholki) {
	int **nowy;
	try {
		nowy = new int*[wierzcholki];
	}
	catch (bad_alloc) {
		cout << "Błąd alokacji tablicy";
		cin.ignore();
		getchar();
		exit(0);
	}
	for (int i(0); i < wierzcholki; i++) {
		try {
			nowy[i] = new int[wierzcholki];
			memset(nowy[i], 0, sizeof(int)*wierzcholki);
		}
		catch (bad_alloc) {
			cout << "Błąd alokacji tablicy";
			cin.ignore();
			getchar();
			exit(0);
		}
	}
	return nowy;
}

 

komentarz 22 kwietnia 2017 przez draghan VIP (106,230 p.)
To nie jest typ int, tylko int** - wskaźnik na wskaźnik typu int. To spora różnica.

Teraz zależy, co Ty chcesz zrobić z tym wektorem. Najlepiej by było, gdybyś zmienił sygnaturę funkcji ReadFromFile i przesyłał tam wektor.
komentarz 22 kwietnia 2017 przez Barteck125 Obywatel (1,120 p.)
Mogę zrobić drugą funkcje ReadFromFile tylko dla vektora nie ma problemu, tylko nie wiem jak miałbym zwrócić ten wektor za pomocą tej funkcji, abym mógł go pózniej wysłać do ReadFromFile.
komentarz 22 kwietnia 2017 przez Barteck125 Obywatel (1,120 p.)
Jest możliwość, aby mi Pan jakoś pomógł ? Vektory to dla mnie nowość i teraz stoje w miejscu nie wiem jak ruszyć dalej.

1 odpowiedź

+1 głos
odpowiedź 22 kwietnia 2017 przez draghan VIP (106,230 p.)
wybrane 22 kwietnia 2017 przez Barteck125
 
Najlepsza

Mogę zrobić drugą funkcje ReadFromFile tylko dla vektora nie ma problemu, tylko nie wiem jak miałbym zwrócić ten wektor za pomocą tej funkcji, abym mógł go pózniej wysłać do ReadFromFile.

Możesz go zwrócić... po prostu. :) I ustalenie rozmiaru może odbywać się już w inicjalizacji:

#include <iostream>
#include <vector>

template <typename T>
auto CreateVector(size_t wierzcholki)
{
    using vector_T = std::vector<T>;
    auto mac = std::vector<vector_T>{wierzcholki, vector_T(wierzcholki)}; // podaję rozmiar w konstruktorze
    return mac; // zwracam wektor 2d
}

template <typename T>
void PrintVector(const std::vector<std::vector<T>> & tab) // parametrem jest referencja do stałego wektora 2d
{
    for(const auto &row : tab)
    {
        for(const auto &cell : row)
        {
            std::cout<<cell<<' ';
        }
        std::cout<<'\n';
    }
}

int main()
{
    auto tab = CreateVector<int>(5);
    PrintVector(tab);
}

 

komentarz 22 kwietnia 2017 przez Barteck125 Obywatel (1,120 p.)
Mam tylko takie jedno pytanie na koniec jeszcze. Co to znaczy to row i cell? w PrintVector?
komentarz 22 kwietnia 2017 przez draghan VIP (106,230 p.)

A jeśli chciałbym jeszcze wypełnić ten wektor za pomocą pętli tak jak tab dwuwymiarową to zrobić to podobnie to tego PrintVector ?

Tak. Możesz to zrobić też w "starym stylu", ale pętla zakresowa for jest przyjemniejsza w użyciu.

template <typename T>
void FillVector(std::vector<std::vector<T>> & tab) // już bez modyfikatora 'const', bo modyfikujemy elementy
{
    for(auto &row : tab)
    {
        for(auto &cell : row)
        {
            cell = 10;
        }
    }

    /*
        lub po staremu:
        
    for(size_t i = 0; i < tab.size(); ++i)
    {
        for(size_t j = 0; j < tab[i].size(); ++j)
        {
            tab[i][j] = 10;
        }
    }
    */
}

Mam tylko takie jedno pytanie na koniec jeszcze. Co to znaczy to row i cell? w PrintVector?

To są zmienne, na których pracuje pętla zakresowa for. Jeśli masz pętlę:

for(auto& element : tab)

to ona przebiegnie po całym zakresie kolekcji (np. wektora) tab, a zmienna element będzie kolejno przyjmowała wartości tab[0], tab[1], tab[2] ... tab[size - 1].

komentarz 22 kwietnia 2017 przez Barteck125 Obywatel (1,120 p.)
Bardzo Ci dziękuje :) Dzięki wytłumaczeniu zacząłem to pojmować. Teraz moje zadanie ruszy do przodu. Kawał dobrej roboty. Jeszcze raz dziękuje i życze wszystkiego co najlepsze :) Pozdrawiam
komentarz 22 kwietnia 2017 przez draghan VIP (106,230 p.)
Na zdrowie. :) Jeśli czegoś jeszcze nie rozumiesz, pytaj śmiało.

Podobne pytania

0 głosów
3 odpowiedzi 1,517 wizyt
pytanie zadane 17 października 2015 w C i C++ przez Ehlert Ekspert (212,630 p.)
0 głosów
4 odpowiedzi 1,126 wizyt
pytanie zadane 21 lutego 2017 w C i C++ przez Danthee Początkujący (260 p.)
0 głosów
1 odpowiedź 531 wizyt
pytanie zadane 10 maja 2016 w C i C++ przez Ditrix Mądrala (5,650 p.)

92,454 zapytań

141,262 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...