NULL-Ptr für container?



  • hallo, ich stehe vor dem problem, das ich die knoten
    meines baumes gerne in einem vector speichern würde,

    dazu müsste ich aber jedem knoten einen std::vector<Knoten>::iterator verpassen,
    damit er seinen "Vater" kennt

    egal, was ich suche ist :
    eine std::vector<Knoten>::iterator welcher NIE passt 🙂
    sowas wie einen Null-Ptr für iteratoren, gibt es sowas?
    denn end() ist ja meiner Meinung das ende einer Instanz eines containers,
    und gilt nicht für jeden container, ich hoffe ich habe mich verständlich
    ausgedrückt 🙂



  • std:vector<Knoten>::iterator it= NULL;
    
    if (it==NULL){
    //Kein vater, also wurzel;
    }
    


  • struct knoten {
       knoden *parent;
       any data;
       knoten() {
         parent = 0;
       }
       knoten (knoten *x) {
          parent = x;
       }
    };
    ..
    std::vector<knoten*> klist;
    
    klist.push_back(new knoten(*klist.begin()));
    

    iwie so..



  • will bei mir mit gcc 4.1.2 nicht

    #include <vector>
    
    int main()
    {
    std::vector<double>::iterator it = NULL;
    if(it == NULL)
     {
     }
    }
    

    test.cpp: In function 'int main()':
    test.cpp:5: error: conversion from 'int' to non-scalar type '__gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >' requested
    test.cpp:6: error: no match for 'operator==' in 'it == 0'

    und die version mit den Pointern habe ich genauso schon implementiert,
    die will ich aber nicht mehr



  • warum?
    btw: kannst dir auch mal die smart pointer anschauen, damit bist du vor leaks ganz gut geschützt..
    du könntest auch als parent einfach ein int speichern und über den []-operator drauf zugreifen. wenn dein Parent-Int = -1 ist, hats keinen..



  • wenn schon, dann musst du den iterator dereferenzieren.

    if (*it == NULL) {}



  • 1. Das von Boris ist Quatsch.
    2. Der "Null-Pointer" für Iteratoren ist der Ende-Iterator eines Containers. Allerdings braucht man dafür auch einen gültigen Container.



  • Könnte man dafür nicht einfach einen default-konstruierten Iterator nehmen?



  • Braunstein schrieb:

    Könnte man dafür nicht einfach einen default-konstruierten Iterator nehmen?

    Ich habe wegen eines anderen Problems gestern erst das Kapitel über Iteratoren im Standard gewälzt. Dabei bin ich wohl zufällig über die hier relevante Passage gestolpert:

    24.1/5 schrieb:

    Just as a regular pointer to an array guarantees that there is a pointer value pointing past the last element of the array, so for any iterator type there is an iterator value that points past the last element of a corresponding container. These values are called past-the-end values. Values of an iterator i for which the expression i is defined are called dereferenceable. The library never assumes that past-the-end values are dereferenceable. Iterators can also have singular values that are not associated with any container. [Example: After the declaration of an uninitialized pointer x (as with int x;), x must always be assumed to have a singular value of a pointer. ] Results of most expressions are undefined for singular values; the only exception is an assignment of a non-singular value to an iterator that holds a singular value. In this case the singular value is overwritten the same way as any other value. Dereferenceable values are always nonsingular.

    Daraus folgere ich, dass der Ausdruck "Vergleich" auf einen Iterator, der Default-Konstruiert ist (sprich einen singulären Wert enthält) undefiniert ist.



  • simon.gysi schrieb:

    wenn schon, dann musst du den iterator dereferenzieren.

    if (*it == NULL) {}

    ups..
    vergessen 😮


Anmelden zum Antworten