Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

(c++)Πως Βρίσκουμε Πόσα στοιχεία χρησιμοποιούνται σε έναν πίνακα;

Îåêßíçóå áðü ôï ìÝëïò tommaσ. Τελευταία δημοσίευση από το μέλος tommaσ στις 28-05-2007, 19:55. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  28-05-2007, 13:48 32272

    (c++)Πως Βρίσκουμε Πόσα στοιχεία χρησιμοποιούνται σε έναν πίνακα;

    Θα ήθελα να μάθω πως μπορούμε να βρούμε , σε ένα πίνακα , ποια στοιχεία χρησιμοποιούνται.

    Μέχρι τώρα όταν ήθελα να βρω την χωρητικότητα ενός πίνακα έκανα το εξής:
    Π.χ. αν είναι int που στο δικό μου πιάνει 4 έκαστος τα στοιχεία , έβαζα την συνάρτηση sizeof() στον πίνακα και μου επέστρεφε π.χ. 40 αν το διερούσαμε με το 4 θα μου έβγαζε 10 ,  ακριβός όσα είχα δηλώσει για να είναι τα στοιχία του πίνακα!

    αν δεν τα έχω όλα τα στοιχεία χρησιμοποιημένα ; πως θα βρω πια έχω και να ta χρησιμοποιήσω μέχρι εκεί; τα θέλω για την υλοποίηση βρόχου For

    O κώδικας πάντα σε c++!

     

  •  28-05-2007, 14:35 32273 σε απάντηση της 32272

    Απ: (c++)Πως Βρίσκουμε Πόσα στοιχεία χρησιμοποιούνται σε έναν πίνακα;

    Μπορείς να πεις ότι δεν έχεις βάλει τιμή σε κάποια στοιχεία του πίνακα, αλλά δεν έχει νόημα να πεις ότι δεν είναι χρησιμοποιημένα. Τιμή θα έχουν ήδη, και οι θέσεις μνήμης είναι ήδη κρατημένες. Με τον απλό πίνακα δεν μπορείς να ξέρεις σε πόσες θέσεις έχεις βάλει εσύ τιμή και σε πόσες υπάρχει η default τιμή.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  28-05-2007, 14:50 32275 σε απάντηση της 32273

    Απ: (c++)Πως Βρίσκουμε Πόσα στοιχεία χρησιμοποιούνται σε έναν πίνακα;

    Λέγοντας πόσα είναι χρησιμοποιημένα εννοώ πόσα έχουν τιμή. Λόγου χάρη αν σε έναν πίνακα A[10] έχουν πάρει τιμή τα 5 [ Α[10] = { 1,2,3,4,5} ]πώς μπορώ να το βρω εγώ και να βάλω έναν βρόχο for να εκτελεστή τόσες φορές;

    Σε ψευδοκώδικα αυτό που θέλω να φτιάξω πρέπει να είναι

    Ίσως έτσι:

    Για j <-- 2 έως μήκος[A]

    Για = for

  •  28-05-2007, 18:30 32286 σε απάντηση της 32275

    Απ: (c++)Πως Βρίσκουμε Πόσα στοιχεία χρησιμοποιούνται σε έναν πίνακα;

    Το πρόβλημά σου στη γενική περίπτωση δεν έχει λύση, και υπάρχουν οι εξής διακριτές περιπτώσεις:

    (1) Ο πίνακας είναι τύπου χωρίς constructor, για τον οποίο τύπο δεν υπάρχει τιμή με την "κενή" σημασιολογία, π.χ. int. Στην περίπτωση αυτή, η ερώτηση αν ένα στοιχείο του πίνακα είναι άδειο ή γεμάτο απλά δεν έχει νόημα.

    (2) Ο πίνακας είναι τύπου χωρίς ctor, αλλά ο τύπος έχει "κενή" τιμή, π.χ. είναι πίνακας από pointers. Τότε, μπορείς να βρεις τα "γεμάτα" στοιχεία, αρκεί μετά τη δήλωσή του να έχεις αρχικοποιήσει όλα τα στοιχεία στην κενή τιμή, π.χ.

    int *x[3];
    for (int index=0; index<sizeof(x)/sizeof(x[0]); ++index)
      x[index] = NULL;


    (3) Ο πίνακας περιέχει αντικείμενα, και ο parameterless ctor της κλάσης αρχικοποιεί το κάθε αντικείμενο έτσι ώστε να είναι αναγνωρίσιμο ως "κενό". Τότε μπορείς και πάλι να ελέγξεις ποια αντικείμενα είναι "κενά" και ποια όχι.

    Αν καταλαβαίνω καλά το πρόβλημά σου, θέλεις να έχεις πίνακες των οποίων το μέγεθος δε σου είναι γνωστό εξ αρχής. Μπορείς για το σκοπό αυτό να χρησιμοποιήσεις την κλάση std::vector της STL, η οποία σου δίνει έναν container που μπορείς να χρησιμοποιήσεις με random access με τον τελεστή [ ], και μεγαλώνει όσο του προσθέτεις στοιχεία. Το πλήθος των στοιχείων που περιέχει δίνεται από τη μέθοδο size(), π.χ.

    #include <vector>

    std::vector<int> x;
    cout << x.size() << endl; // τυπώνει 0
    x.push_back(42);
    x.push_back(39);
    cout << x.size() << endl; // τυπώνει 2
    cout << x[1] << endl; // τυπώνει 39


    Νατάσα Μανουσοπούλου
  •  28-05-2007, 19:55 32290 σε απάντηση της 32286

    Απ: (c++)Πως Βρίσκουμε Πόσα στοιχεία χρησιμοποιούνται σε έναν πίνακα;

    Πολύ ενδιαφέρον και διαφωτιστικά αυτά που γράφεις κ.Νατάσα. Λύθηκε το πρόβλημα :

    #include <vector> 

    std::vector<int> A;

          // Στοιχεία
    A.push_back(0); A.push_back(5); A.push_back(8); A.push_back(4); A.push_back(6); A.push_back(1); A.push_back(7); A.push_back(13);A.push_back(23);A.push_back(1);
              // Στοιχεία 


           for(int j = 2;j < A.size();j++) 
                {
           
    […]
                }

    Ωστόσο θα προσπαθήσω να βοηθήσω και αυτούς που θα μας διαβάσουν στο μέλλον. Λοιπόν . Όταν δημιουργείτε το στιγμιότυπο Α είναι κενό δηλαδή έχει μέγεθος 0 . Χρησιμοποιώντας τη συναρτήσεις push_back που είναι διαθέσιμη σε όλα τα γενικά «αντικείμενα σειράς» , προστίθεται ένα στοιχείο στο ΤΕΛΟΣ!

    Προσοχή : Αυτό σημάνει πως για να αλλάξει κάτι( ή να διαγραφή) που είναι στην μέση του δυναμικού πίνακα , πρέπει να μετακινηθούν όλα τα στοιχεία που έχουν πιάσει θέση , προς τα δεξιά του , ένα. Κάτι που για μεγάλους πίνακες θα είναι χρονοβόρο. Επίσης είναι γρηγορότερο κιόλας να εισάγετε πολλά στοιχεία ταυτόχρονα , αντί για ένα κάθε φορά.

    Σημ. Επιλέξτε το vector για να έχετε καλύτερη απόδοση όταν υπάρχει τυχαία πρόσβαση.

    Επίσης Υπάρχει το size.Το size επιστρέφει τον αριθμό των στοιχείων που είναι αποθηκευμένα εκείνο το δευτερόλεπτο , εκείνη την στιγμή.

    Όπως και το Capαcity επιστρέφει το αριθμό των στοιχείων που μπορούν να αποθηκευθούν πριν αλλάξει δυναμικά μέγεθος το ίδιο το vector  για να χωρέσει περισσότερα στοιχεία.
     Αν έκανα κάπου λάθος διορθώστε με. Πάντως υπάρχουν πολλές τεχνικές που μπορούν να γίνουν με το vector  και άρχισε να μου αρέσει πολύ.

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems