Wielowymiarowe wektory

Odpowiedz Nowy wątek
2011-12-27 16:26
0

Witam,
ostatnio natrafiłem gdzieś w internecie na artykuł o wektorach w C++ i mówiąc szczerzę gościu tam się wypowiadający mnie przekonał.
Mam jednak kilka pytań co do tego;
-Czy to rzeczywiście tak jest z tymi wektorami, że to niby są lepsze niż tablice i zużywają mniej pamięci?
-Jak tworzy się vektory wielowymiarowe (chodzi mi tutaj o taki 4-wymiarowy)
Podrawiam.
Wesołych świąt i szczęśliwego Nowego Roku :D

Pozostało 580 znaków

2011-12-28 18:55
1

W zasadzie standard jest jeden. ISO/IEC 14882:2011, zwany C++11, przyjęty 12 sierpnia br. Oczywiście nie wszystkie kompilatory wspierają go w 100%, dlatego przez jakiś czas będzie sie mówić o tym C++11 i poprzednim C++03 i o tym jak to różne rzeczy działają w nich inaczej. W GCC trzeba dodać -std=c++0x do komendy kompilatora, żeby go używać, w MSVC (cl) chyba nie trzeba niczego dodawać.


"(...) otherwise, the behavior is undefined".
edytowany 1x, ostatnio: Endrju, 2011-12-28 18:56

Pozostało 580 znaków

2011-12-28 20:57
0
Jadeszek napisał(a)

[...]

Potem możesz go sobie poszerzać za pomocą resize() albo dodawać elementy na wierzch przez push_back().
Oczywiście3 wygodniej byłoby sobie zrobić jakieś typedefy do tego, na przykład tak jak tutaj - http://www.daniweb.com/software-development/cpp/threads/137814

A czy to rozszerzanie jest konieczne?
Nie lubię mieć braków w wiedzy więc zagłębiłem się w te arcyciekawy artykuł (:P):
http://sadi.ovh.org/arty/cppwektory.php
W którym autor niezbicie twierdzi, że wektory same sobie znajdują pamięć dla naszych zmiennych i nie trzeba troszczyć się o wstawianie "push_back()" i tym podobnych.
Jest to w części: "Wektory, a dynamiczne tablice"

Zwróć uwagę na to, że deklarujemy tylko 3 elementy, a dalej chcemy operować na 10. Jest to jawne wykroczenie poza zakres, połączone z niszczeniem danych z pamięci, która nie należy do naszego programu. A raczej tak by było, gdybyśmy użyli zwykłej tablicy. Wektor jednak jest na tyle sprytny, że zwiększa swoje rozmiary, gdy chcemy coś zrobić z polem, które nie istnieje. Innymi słowy wektor zawsze ma dokładnie tyle pól ile trzeba, ale nie mniej niż zadeklarowaliśmy. Dlatego stosując wektor w programie, w którym najpierw pobieramy od użytkownika rozmiar tablicy, a potem jej elementy, praktycznie nie obchodzą nas kwestie związane z pamięcią!

A więc jak to w końcu jest? ^^

Pozostało 580 znaków

2011-12-28 21:02
1

Lolwut. Zmień w tamtym kodzie [i] na .at(i) i dostaniesz piękny wyjątek. Przy [i] runtime się również wysypuje. std::vector nic sam nie zrobi, to jakieś brednie.


"(...) otherwise, the behavior is undefined".

Pozostało 580 znaków

2011-12-29 16:09
0

OK. Tym razem to już mam nadzieję ostatnia wątpliwość:
Jak użyć "push_back()" do wielowymiarowego wektora,jeśli przykładowo chciałbym dodać element z wymiaru trzeciego?
Ja nie wiem jakim cudem tego nie ma w internecie. Toż to podstawa.
EDIT:
Co prawda kolega dał tutaj kod:

Krycho napisał(a)

#include <iostream>
#include <vector>

using namespace std;
int main()
{
vector< vector< vector< vector<int> > > > tab;
vector< vector< vector<int> > >tab4;
vector< vector<int> >tab2;
vector<int> tab3;
tab3.push_back(5);
tab3.push_back(2);
tab2.push_back(tab3);
tab4.push_back(tab2);
tab.push_back(tab4);
cout << tab[0][0][0][0]; //5
cout << tab[0][0][0][1]; //2
return 0;
}


> 
> Masz wektor 4 wymiarowy. Jesli nie masz sprecyzowanej wielkosci musisz mu robic cos takiego. Najpierw najbardziej podstawowy wektor 1 wymiarowy. Dodajesz elementy i wrzucasz do 2 wymiarowego caly wektor. Potem do 3 i na koncu do 4. To jest tak jakby kazdy element tego 4 wymiarowego wektora byl wektorem 3 wymiarowym. Nie potrafie tego dobrze wyjasnic po prostu tak jest ;).

natomiast tu jest straszny "misz-masz". Nic nie rozumiem.
I nie da się tego rozwiązać bez potrzeby tworzenia innych wektorów?</del>
Działa :D
edytowany 3x, ostatnio: Losiu22, 2011-12-29 17:38

Pozostało 580 znaków

2011-12-31 12:16
0

Wprowadziłem ten kod w życie:

vector< vector< vector< vector<int> > > > Vpush_back(int dana,  vector< vector< vector< vector<int> > > >vector4){
    vector< vector< vector<int> > >vector3;
    vector< vector<int> >vector2;
    vector<int> vector1;

    vector1.push_back(dana);
    vector2.push_back(vector1);
    vector3.push_back(vector2);
    vector4.push_back(vector3);

    return vector4;
}

Tknął mnie tylko jeden mały szczegół :/
Za każdym razem nowa liczba będzie dodawana na początek (czyli zawsze zmieniane będzie to: vector[0][0][0][0])
Dlaczego? Bo za każdym razem tworzymy od nowa vector1 :/
Czy ktoś zna jakieś rozwiązanie co zrobić aby dodać następny element do wektora a nie nadmienić pierwszy?
PS: Nie ma tutaj opcji typu: usuń post? Poprzedni wysłał się 2 razy.

edytowany 3x, ostatnio: Losiu22, 2011-12-31 13:01
Jest, w lewym dolnym rogu postu, taki znaczek czerwony z minusikiem. - xeo545x39 2011-12-31 12:57

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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