Metody (template) dla array helper'a

Odpowiedz Nowy wątek
2018-05-06 20:48
0

Panowie,

Zaczynam sobie przygotowywac custom helper'a dla wielowymiarowych tablic. Zaczalem od dwoch metod template:
1) inicjalizacja tablicy:

        template <typename T>
        T** initArr2DT(T** arr2DPtr, int iLength, int jLength)
        {
            arr2DPtr = new T*[iLength];

            for (int i = 0; i < iLength; i++)
            {
                arr2DPtr[i] = new T[jLength];

                memset(arr2DPtr[i], '\0', sizeof(arr2DPtr[i]));
            }

            return arr2DPtr;
        }

2) kopiowanie tablicy:

        template <typename T>
        T** copyArr2DT(T** arr2DPtr, T** arr2DCopyPtr, int iLength, int jLength)
        {
            arr2DCopyPtr = new T*[iLength];

            for (int i = 0; i < iLength; i++)
            {
                arr2DCopyPtr[i] = new T[jLength];

                for (int j = 0; j < jLength; j++)
                {
                    arr2DCopyPtr[i][j] = arr2DPtr[i][j];
                }
            }

            return arr2DCopyPtr;
        }

Prosze o ich ocene i ewentualne wskazowki co do ulepszenia kodu.
Z gory dziekuje :)

Pozostało 580 znaków

2018-05-07 15:46
0

ogólnie mógłbys przedstawić zamysł Bo mi się coś tu nie podoba. Szczególnie te pointery na int.


We are the 4p. Existence, as you know it, is over. We will add your biological and technological distinctiveness to our own. Resistance is futile

Pozostało 580 znaków

2018-05-07 15:52
1
Constantic napisał(a):

Przypisanie dziala bez zarzutu, ale typ "vector<vector<string>>" deklarowany w ciele metody nie jest tozsamy z "typedef std::vector<std::vector<string>> ArrString2D;" :/

Nie masz gdzieś przypadkiem użyte using namespace std?

revcorey napisał(a):
ArrString2D arrString2D(*rowsNumberPtr, vector<string>(*colsNumberPtr));

Co ty chcesz tu zrobić? masz typ vector<vector<>> i skąd weźmiesz taki konstruktor? Po prostu zrób tak

A co jest z tym nie tak? test

zgadzam się z tobą, spojrzałem do specki jest taki konstruktor. - revcorey 2018-05-07 15:57
cpp potrafi nie raz pozytywnie zaskoczyć ;) - tajny_agent 2018-05-07 19:50

Pozostało 580 znaków

2018-05-07 19:45
0
revcorey napisał(a):

ogólnie mógłbys przedstawić zamysł Bo mi się coś tu nie podoba. Szczególnie te pointery na int.

Hmm, zamysl jest taki, ze utworzylem sobie klase do poboru danych konfiguracyjnych roznego typu. Ze wzgledu na poprzednia wersje tablic, klasa ta ma osobna metode do odczytu wymiarow tablic oraz osobna metode to ich odczytu i zapisu w postaci tablicy string (potem te tablice sa konwertowane na odpowiednie typy docelowe w klasach obslugujacych wlasciwe sobie zestawy konfiguracyjne).

Jesli chodzi o te pointery parametrach integer to odnosza sie one do atrybutow wymiarow tablicy tej samej klasy do ktorej nalezy metoda. Oczywiscie na pierwszy rzut oka wydaje sie zbedne przekazywanie atrybotow klasy do metody ktora rowniez do tej samej klasy nalezy - nie jestem jednak pewien czy nie bede uzywal tej funkcji w przypadku danych innych niz konfiguracyjne zatem postanowilem pozostawic ja w postaci odrobine bardziej uniwersalnej. Nadal pozostaje kwestia pointerow - chyba dlatego zeby miec pewnosc ze za kazdym razem odwoluje sie do odpowiednich wartosci jednak co tu duzo mowic - jeszcze troche kodu "uplynie" zanim tak naprawde zaczne nimi swobodnie operowac.

Pozostało 580 znaków

2018-05-07 19:49
0
tajny_agent napisał(a):
Constantic napisał(a):

Przypisanie dziala bez zarzutu, ale typ "vector<vector<string>>" deklarowany w ciele metody nie jest tozsamy z "typedef std::vector<std::vector<string>> ArrString2D;" :/

Nie masz gdzieś przypadkiem użyte using namespace std?

No wlasnie o to chodzi, ze tak. Dzieki temu kilka innych deklaracji method zamiast "std::string" strkocilem do "string". Jak sie domyslam nie zadales tego pytania ot tak sobie i mozliwe, ze masz w zwiazku z tym cos do dodania :/ ...

Pozostało 580 znaków

2018-05-07 20:13
0

Zainteresował mnie ten typedef i niekonsekwencja z przedrostkiem std

typedef std::vector<std::vector<string>> ArrString2D;

Ale w sumie VS bez problemu mi taki misz-masz przepuścił, więc mój strzał raczej chybiony ;)

Pozostało 580 znaków

2018-05-07 20:41
0

Hmm, zamysl jest taki, ze utworzylem sobie klase do poboru danych konfiguracyjnych roznego typu.

czy możemy użyć std::map w w stylu std::map<string,string> gdzie jedno to parametr drugie wartość albo nawet std::vector<std::pair<string,string>> albo nawet std::tuple(jest jeszcze std::variant w c++17) w ostatecznej ostateczności jeśli jest taka potrzeba? Przejrzyj to.
Więcej później bo jestem zajęty. :)


We are the 4p. Existence, as you know it, is over. We will add your biological and technological distinctiveness to our own. Resistance is futile
edytowany 2x, ostatnio: revcorey, 2018-05-07 20:42

Pozostało 580 znaków

2018-05-07 21:06
0

esli chodzi o te pointery parametrach integer to odnosza sie one do atrybutow wymiarow tablicy tej samej klasy do ktorej nalezy metoda. Oczywiscie na pierwszy rzut oka wydaje sie zbedne przekazywanie atrybotow klasy do metody ktora rowniez do tej samej klasy nalezy - nie jestem jednak pewien czy nie bede uzywal tej funkcji w przypadku danych innych niz konfiguracyjne zatem postanowilem pozostawic ja w postaci odrobine bardziej uniwersalnej. Nadal pozostaje kwestia pointerow - chyba dlatego zeby miec pewnosc ze za kazdym razem odwoluje sie do odpowiednich wartosci jednak co tu duzo mowic - jeszcze troche kodu "uplynie" zanim tak

std::vector rozszerza się automatycznie. Oczywiście jak uprzednio zarezerwujesz pamięć to może nie być albo może być mniej alokacji później.Proste prymitywne typy jak int czyli tu rozmiar tablicy/vectora przekazuj przez wartość, taki zapis foo(int size) zostanie zoptymalizowany przez kompilator(użycie referencji mogło by tu sprawę pogorszyć, jeśli idzie o proste typy). A jak już tak chcesz przekazać takie rzeczy przez wskaźnik czy referencje pamiętaj o const.

No wlasnie o to chodzi, ze tak. Dzieki temu kilka innych deklaracji method zamiast "std::string" strkocilem do "string". Jak sie domyslam nie zadales tego pytania ot tak sobie i mozliwe, ze masz w zwiazku z tym cos do dodania :/ ...

Kolizja nazw np. jak będziesz chciał użyć innej biblioteki stringów?


We are the 4p. Existence, as you know it, is over. We will add your biological and technological distinctiveness to our own. Resistance is futile
edytowany 3x, ostatnio: revcorey, 2018-05-07 21:09

Pozostało 580 znaków

2018-05-07 21:32
0
revcorey napisał(a):

std::vector rozszerza się automatycznie. Oczywiście jak uprzednio zarezerwujesz pamięć to może nie być albo może być mniej alokacji później.

Wlasnie ze wzgledu na te koniecznsc wielokrotnych alokacji zdecydowalem sie najpierw szybciutko odczytac rozmiary tablicy, a nastepnie zadeklarowac ja jednznacznie (dynamicznie) w celu przypisania danych. Fakt to podwojna robota, ale pliki konfiguracyjne do obslugi sa malenkie i mam ich ok 7 sztuk.

revcorey napisał(a):

Proste prymitywne typy jak int czyli tu rozmiar tablicy/vectora przekazuj przez wartość, taki zapis foo(int size) zostanie zoptymalizowany przez kompilator(użycie referencji mogło by tu sprawę pogorszyć, >jeśli idzie o proste typy). A jak już tak chcesz przekazać takie rzeczy przez wskaźnik czy referencje pamiętaj o const.

Tu mnie masz, tego nie bylem swiadomy, dzieki.

revcorey napisał(a):

Kolizja nazw np. jak będziesz chciał użyć innej biblioteki stringów?

To tez prawda, chociaz w moim przypadku a zwlaszcza w przypadku aplikacji ktora pisze to raczej malo prawdopodobne - jesli chodzi o programowanie jestem "prymitywista" :) z wyboru i za wszelka cene staram sie opierach na jak najbardziej podstawowych rozwiazaniach.

Bardzo Ci dziekuje za wskazowki i sugestie.

Pozostało 580 znaków

2018-05-07 21:44
0

lasnie ze wzgledu na te koniecznsc wielokrotnych alokacji zdecydowalem sie najpierw szybciutko odczytac rozmiary tablicy, a nastepnie zadeklarowac ja jednznacznie (dynamicznie) w celu przypisania danych. Fakt to podwojna robota, ale pliki konfiguracyjne do obslugi sa malenkie i mam ich ok 7 sztuk.

To jest przerost formy nad treścią według mnie ze względu że to będą małe vectory, nie ma w standardzie tego określonego ale zazwyczaj startowe capacity to 0, tyle że później vector potrafi sobie na zapas zaalokować aby uniknąć zbyt wielu odwołań menadżera pamięci.

To tez prawda, chociaz w moim przypadku a zwlaszcza w przypadku aplikacji ktora pisze to raczej malo prawdopodobne - jesli chodzi o programowanie jestem "prymitywista" :) z wyboru i za wszelka cene staram sie opierach na jak najbardziej podstawowych rozwiazaniach.

To jest zajebisty błąd. Po to porobiono te mapy, vectory i inne w std czy w języku jakieś r-wartości żeby z tego korzystać. Te kontenery czy algorytmy std też są pisane tak żeby być dość wydajne, oczywiście nie zawsze to będzie najwydajniejsze rozwiązanie ze względu na mnogość sytuacji. Co więcej jak zaczniesz budować jakieś swoje własne cuda możesz się pomylić albo porobi się takie spageti że spadnie ci wydajność. jechanie na dziś dzień na gołych wskaźnikach bez wyraźnego powodu to błąd. C++ to nie java script i frontend że co byś na tym nie napisał będzie mulić.

edit:
Polecam ci lekturę clean code.
poczytaj też o clang-tidy.


We are the 4p. Existence, as you know it, is over. We will add your biological and technological distinctiveness to our own. Resistance is futile
edytowany 2x, ostatnio: revcorey, 2018-05-07 21:45

Pozostało 580 znaków

2018-05-08 00:58
1

Bezpiecznie jest założyć, że w temacie struktur danych typu wektor, hashmapa itd. kompilator wie co robi. Ba, bezpiecznie jest założyć, że sami nie wiemy. Na CodeDive w 2015 bodajże ktoś robił zestawienie memset vs std::fill vs pętla i wyszło, że nawet dla małego embedded typu AVR STL potrafi być o parę procent szybszy jeżeli ten kod ma być czytelny. Czyli jak zwykle: „(jeszcze) nie optymalizuj”. Z mojego doświadczenia: raz wygrałem z kompilatorem walkę „C kontra C++”, tzn przepisanie wszystkiego w C pomogło, ale i tak bez dodatkowych flag kompilacji i atrybutów funkcji się nie obeszło. Ugraliśmy jedną czy dwie instrukcje asemblerowe, czyli w sumie może 8 bajtów objętości kodu (pewnie mniej, już nie pamiętam) w stosunku do 1kB całości. Tyle, że to było gotowe urządzenie z ATTiny13 z flashem 1kB zajętym w 95% i z całą odpowiedzialnością pisałem kod tak, żeby się zmieścił, nie żeby był czytelny. Piszesz na takie urządzenia? Nawet jeśli, to zmierz, potem optymalizuj, inaczej tylko powtarzasz mitologię.

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