Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Special Interest Groups
  3. C++ Gurus
  4. How to return myclass reference?
Forum Updated to NodeBB v4.3 + New Features

How to return myclass reference?

Scheduled Pinned Locked Moved Solved C++ Gurus
18 Posts 7 Posters 6.3k Views 4 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • kshegunovK Offline
    kshegunovK Offline
    kshegunov
    Moderators
    wrote on last edited by
    #6

    Just FYI, there's a rather obscure and bad (in my opinion) feature of the language concerning returning references to local objects. You are allowed to return const references to local objects causing the lifetime of the the object to be extended beyond the usual one, and to be bound to the life time of the const reference itself.

    Here's a longer discussion about it:
    https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/

    Read and abide by the Qt Code of Conduct

    1 Reply Last reply
    3
    • VRoninV Offline
      VRoninV Offline
      VRonin
      wrote on last edited by
      #7

      My suggestion: return a pointer instead of a reference:

      Contact* GlobalAll::getContactByUID(const int &UID) {
          int low = 0, high = this->allContacts.size() - 1;
      
          while (low <= high) {
              int middle = (low + high) >> 1;
      
              if (this->allContacts[middle].UID == UID) {
                  return &(this->AllContacts[middle]);
              }
      
              if (this->allContacts[middle].UID < UID) {
                  low = middle + 1;
              } else {
                  high = middle - 1;
              }
          }
          return nullptr;
      }
      

      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
      ~Napoleon Bonaparte

      On a crusade to banish setIndexWidget() from the holy land of Qt

      ? 1 Reply Last reply
      3
      • VRoninV VRonin

        My suggestion: return a pointer instead of a reference:

        Contact* GlobalAll::getContactByUID(const int &UID) {
            int low = 0, high = this->allContacts.size() - 1;
        
            while (low <= high) {
                int middle = (low + high) >> 1;
        
                if (this->allContacts[middle].UID == UID) {
                    return &(this->AllContacts[middle]);
                }
        
                if (this->allContacts[middle].UID < UID) {
                    low = middle + 1;
                } else {
                    high = middle - 1;
                }
            }
            return nullptr;
        }
        
        ? Offline
        ? Offline
        A Former User
        wrote on last edited by A Former User
        #8

        @VRonin said in How to return myclass reference?:

        Contact* GlobalAll::getContactByUID(const int &UID) {

        Actually I don't see why that is any better than returning nothing at all, void GlobalAll::getContactByUID(const int &UID) { ...

        VRoninV 1 Reply Last reply
        0
        • JohanSoloJ JohanSolo

          You can't: to return a reference the returned object must exist outside the function scope. To "solve" the issue you must either change the signature to Contact GloballAll::getContactByUID() or to something like bool GloballAll::getContactByUID( ..., Contact& return )

          K Offline
          K Offline
          Konstantin Tokarev
          wrote on last edited by
          #9
          This post is deleted!
          1 Reply Last reply
          0
          • ? A Former User

            @VRonin said in How to return myclass reference?:

            Contact* GlobalAll::getContactByUID(const int &UID) {

            Actually I don't see why that is any better than returning nothing at all, void GlobalAll::getContactByUID(const int &UID) { ...

            VRoninV Offline
            VRoninV Offline
            VRonin
            wrote on last edited by
            #10

            @Wieland I think this is a search function so it must return a "reference" to the object with contact.UID==UID or null if it can't find the item.

            P.S.
            If you find yourself using this function a lot, consider changing allContacts into a QHash<int,Contact> and use the UID as key

            "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
            ~Napoleon Bonaparte

            On a crusade to banish setIndexWidget() from the holy land of Qt

            Taz742T 1 Reply Last reply
            2
            • VRoninV VRonin

              @Wieland I think this is a search function so it must return a "reference" to the object with contact.UID==UID or null if it can't find the item.

              P.S.
              If you find yourself using this function a lot, consider changing allContacts into a QHash<int,Contact> and use the UID as key

              Taz742T Offline
              Taz742T Offline
              Taz742
              wrote on last edited by Taz742
              #11

              @VRonin said in How to return myclass reference?:

              or null if it can't find the item.

              No. Contact will be in my QList.

              @VRonin said in How to return myclass reference?:

              If you find yourself using this function a lot, consider changing allContacts into a QHash<int,Contact> and use the UID as key

              I do not know about QHash <T, T>, It's faster than a binary search?
              If my allContacts.size() == 10 000, 15 Checks i need maximum.

              Do what you want.

              jsulmJ 1 Reply Last reply
              0
              • Taz742T Taz742

                @VRonin said in How to return myclass reference?:

                or null if it can't find the item.

                No. Contact will be in my QList.

                @VRonin said in How to return myclass reference?:

                If you find yourself using this function a lot, consider changing allContacts into a QHash<int,Contact> and use the UID as key

                I do not know about QHash <T, T>, It's faster than a binary search?
                If my allContacts.size() == 10 000, 15 Checks i need maximum.

                jsulmJ Offline
                jsulmJ Offline
                jsulm
                Lifetime Qt Champion
                wrote on last edited by
                #12

                @Taz742
                http://doc.qt.io/qt-5/containers.html#algorithmic-complexity

                https://forum.qt.io/topic/113070/qt-code-of-conduct

                Taz742T 1 Reply Last reply
                2
                • jsulmJ jsulm

                  @Taz742
                  http://doc.qt.io/qt-5/containers.html#algorithmic-complexity

                  Taz742T Offline
                  Taz742T Offline
                  Taz742
                  wrote on last edited by Taz742
                  #13

                  @jsulm @VRonin Thank guys.
                  Also there are good example http://developers-club.com/posts/170017/

                  @VRonin said in How to return myclass reference?:

                  If you find yourself using this function a lot, consider changing allContacts into a QHash<int,Contact> and use the UID as key

                  I think you are right. Thank.
                  how much seconds will be lost if I search an element in QList one milion times(if i use binary search) and how much will be reserved in QHash?

                  Do what you want.

                  jsulmJ kshegunovK 2 Replies Last reply
                  0
                  • Taz742T Taz742

                    @jsulm @VRonin Thank guys.
                    Also there are good example http://developers-club.com/posts/170017/

                    @VRonin said in How to return myclass reference?:

                    If you find yourself using this function a lot, consider changing allContacts into a QHash<int,Contact> and use the UID as key

                    I think you are right. Thank.
                    how much seconds will be lost if I search an element in QList one milion times(if i use binary search) and how much will be reserved in QHash?

                    jsulmJ Offline
                    jsulmJ Offline
                    jsulm
                    Lifetime Qt Champion
                    wrote on last edited by
                    #14

                    @Taz742 said in How to return myclass reference?:

                    how much seconds will be lost if I search an element in QList one milion times and how much will be reserved in QHash?

                    Searching in a list is O(n). Statistically you will need n/2 comparisons to find what you're looking for. Hash is O(1) - so much faster. For lookup you should use QHash or QMap not QList.

                    You you want to see the difference then just write a small app and measure the time...

                    https://forum.qt.io/topic/113070/qt-code-of-conduct

                    1 Reply Last reply
                    1
                    • Taz742T Taz742

                      @jsulm @VRonin Thank guys.
                      Also there are good example http://developers-club.com/posts/170017/

                      @VRonin said in How to return myclass reference?:

                      If you find yourself using this function a lot, consider changing allContacts into a QHash<int,Contact> and use the UID as key

                      I think you are right. Thank.
                      how much seconds will be lost if I search an element in QList one milion times(if i use binary search) and how much will be reserved in QHash?

                      kshegunovK Offline
                      kshegunovK Offline
                      kshegunov
                      Moderators
                      wrote on last edited by kshegunov
                      #15

                      @Taz742 said in How to return myclass reference?:

                      how much seconds will be lost if I search an element in QList one milion times(if i use binary search) and how much will be reserved in QHash?

                      Algorithmic complexity isn't measured in seconds, but with the so called "big O notation" (asymptotic complexity). Provided you can do a binary search, which implies the list is kept at all times ordered, then the complexity of the search is O(logN). For a hash it's O(1) with worst-case O(N). Now, there are nuances, but most of the time a hash would fare better than a red-black tree (QMap), which would be better than keeping an ordered list and doing a binary search on it. Of course the best is to have everything in a vector and just get the elements by index, but that's not always possible.

                      Read and abide by the Qt Code of Conduct

                      1 Reply Last reply
                      4
                      • ? Offline
                        ? Offline
                        A Former User
                        wrote on last edited by A Former User
                        #16
                        • Simple code is better than complex code.
                        • Only sacrifice simplicity if you have proof that your code is too slow.
                        • The only way to prove that your code is too slow is by measuring execution time against real world data on the target machine.
                        • Don't just assume that algorithmic complexity dominates execution time; you have to measure it.

                        Just my 2 cents.

                        1 Reply Last reply
                        6
                        • K Offline
                          K Offline
                          Konstantin Tokarev
                          wrote on last edited by
                          #17
                          • Avoid premature pessimization - by default use data structures and algorithms which are right for the job, without sacrificing simplicity.

                          Otherwise you may get a death of thousand cuts for performance of your application, when it's not enough to fix a few bottlenecks because all code if uniformly slow.

                          Taz742T 1 Reply Last reply
                          4
                          • K Konstantin Tokarev
                            • Avoid premature pessimization - by default use data structures and algorithms which are right for the job, without sacrificing simplicity.

                            Otherwise you may get a death of thousand cuts for performance of your application, when it's not enough to fix a few bottlenecks because all code if uniformly slow.

                            Taz742T Offline
                            Taz742T Offline
                            Taz742
                            wrote on last edited by
                            #18

                            Pleasant discussion.

                            Do what you want.

                            1 Reply Last reply
                            1

                            • Login

                            • Login or register to search.
                            • First post
                              Last post
                            0
                            • Categories
                            • Recent
                            • Tags
                            • Popular
                            • Users
                            • Groups
                            • Search
                            • Get Qt Extensions
                            • Unsolved