combining two vectors

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Alan

    combining two vectors

    Is there an easy and efficient way to combine two <vector>s, rather
    than taking each element from one and adding it to the other?

    I haven`t been able to find any guidance on or examples of this
    sort of operation.

    Thanks, Alan

  • Ian Collins

    #2
    Re: combining two vectors

    Alan wrote:
    Is there an easy and efficient way to combine two <vector>s, rather
    than taking each element from one and adding it to the other?
    >
    I haven`t been able to find any guidance on or examples of this
    sort of operation.
    >
    vector1.insert( vector1.end(), vector2.begin() , vector2.end() );

    --
    Ian Collins.

    Comment

    • Alan

      #3
      Re: combining two vectors

      Ian, Thanks! Alan

      Comment

      • Stefan Naewe

        #4
        Re: combining two vectors

        Ian Collins schrieb:
        Alan wrote:
        > Is there an easy and efficient way to combine two <vector>s, rather
        >than taking each element from one and adding it to the other?
        >>
        > I haven`t been able to find any guidance on or examples of this
        >sort of operation.
        >>
        >
        vector1.insert( vector1.end(), vector2.begin() , vector2.end() );
        >
        It's easy - yes.
        But is it really efficient ?
        Isn't it as unefficient as repeatedly calling push_bask() on vector1 ?

        /S
        --
        Stefan Naewe
        stefan_DOT_naew e_AT_atlas_DOT_ de

        Comment

        • Pete Becker

          #5
          Re: combining two vectors

          Stefan Naewe wrote:
          Ian Collins schrieb:
          >Alan wrote:
          >> Is there an easy and efficient way to combine two <vector>s, rather
          >>than taking each element from one and adding it to the other?
          >>>
          >> I haven`t been able to find any guidance on or examples of this
          >>sort of operation.
          >>>
          >vector1.insert ( vector1.end(), vector2.begin() , vector2.end() );
          >>
          >
          It's easy - yes.
          But is it really efficient ?
          Isn't it as unefficient as repeatedly calling push_bask() on vector1 ?
          >
          No. The iterators that represent the range being copied are random
          access iterators, so insert can figure out how many elements will be
          added and adjust the size accordingly. Repeatedly calling push_back
          could end up reallocating the storage space more than once.

          --

          -- Pete
          Roundhouse Consulting, Ltd. (www.versatilecoding.com)
          Author of "The Standard C++ Library Extensions: a Tutorial and
          Reference." (www.petebecker.com/tr1book)

          Comment

          • Stefan Naewe

            #6
            Re: combining two vectors

            Pete Becker schrieb:
            Stefan Naewe wrote:
            >Ian Collins schrieb:
            >>Alan wrote:
            >>> Is there an easy and efficient way to combine two <vector>s, rather
            >>>than taking each element from one and adding it to the other?
            >>>>
            >>> I haven`t been able to find any guidance on or examples of this
            >>>sort of operation.
            >>>>
            >>vector1.inser t( vector1.end(), vector2.begin() , vector2.end() );
            >>>
            >>
            >It's easy - yes.
            >But is it really efficient ?
            >Isn't it as unefficient as repeatedly calling push_bask() on vector1 ?
            >>
            >
            No. The iterators that represent the range being copied are random
            access iterators, so insert can figure out how many elements will be
            added and adjust the size accordingly. Repeatedly calling push_back
            could end up reallocating the storage space more than once.
            OK.
            But what if I do a vector1.reserve (x) (with a valid x...) before ?
            'vector2.end()-vector2.begin() ' elements need to be copied after vector1.end(), right?

            (Using std::list and std::list::spli ce() would be more efficient in this case, wouldn't it?)


            /S
            --
            Stefan Naewe
            stefan_DOT_naew e_AT_atlas_DOT_ de

            Comment

            • red floyd

              #7
              Re: combining two vectors

              Stefan Naewe wrote:
              Ian Collins schrieb:
              >Alan wrote:
              >> Is there an easy and efficient way to combine two <vector>s, rather
              >>than taking each element from one and adding it to the other?
              >>>
              >> I haven`t been able to find any guidance on or examples of this
              >>sort of operation.
              >>>
              >vector1.insert ( vector1.end(), vector2.begin() , vector2.end() );
              >>
              >
              It's easy - yes.
              But is it really efficient ?
              Isn't it as unefficient as repeatedly calling push_bask() on vector1 ?
              Why does everyone ask "is this more efficient" in a vacuum?

              Have you benchmarked to determine that your vector operations are the
              bottleneck? An "efficient" program that doesn't work right is not as
              good as an "inefficien t" program that does.

              Hoare's Law (also attributed to Knuth): "Premature optimization is the
              root of all evil".

              Comment

              • Pete Becker

                #8
                Re: combining two vectors

                red floyd wrote:
                Stefan Naewe wrote:
                >Ian Collins schrieb:
                >>Alan wrote:
                >>> Is there an easy and efficient way to combine two <vector>s, rather
                >>>than taking each element from one and adding it to the other?
                >>>>
                >>> I haven`t been able to find any guidance on or examples of this
                >>>sort of operation.
                >>>>
                >>vector1.inser t( vector1.end(), vector2.begin() , vector2.end() );
                >>>
                >>
                >It's easy - yes.
                >But is it really efficient ?
                >Isn't it as unefficient as repeatedly calling push_bask() on vector1 ?
                >
                Why does everyone ask "is this more efficient" in a vacuum?
                >
                Have you benchmarked to determine that your vector operations are the
                bottleneck? An "efficient" program that doesn't work right is not as
                good as an "inefficien t" program that does.
                >
                And how is changing from push_back to insert going to make this code not
                work right?
                Hoare's Law (also attributed to Knuth): "Premature optimization is the
                root of all evil".
                Okay, let's all use bubble sort until we can prove that quicksort will
                be a better choice.

                Sometimes optimization without measurement is perfectly appropriate.
                When there's a choice of two ways to do something and one is slower,
                choose the other.

                for (iter = vector2.begin() ; iter != vector2.end(); ++iter)
                vector1.push_ba ck(*iter);

                versus

                vector1.insert( vector1.end(), vector2.begin() , vector2.end());

                No contest. Use the latter.

                --

                -- Pete
                Roundhouse Consulting, Ltd. (www.versatilecoding.com)
                Author of "The Standard C++ Library Extensions: a Tutorial and
                Reference." (www.petebecker.com/tr1book)

                Comment

                • Ian Collins

                  #9
                  Re: combining two vectors

                  Pete Becker wrote:
                  red floyd wrote:
                  >
                  >>
                  >Why does everyone ask "is this more efficient" in a vacuum?
                  >>
                  >Have you benchmarked to determine that your vector operations are the
                  >bottleneck? An "efficient" program that doesn't work right is not as
                  >good as an "inefficien t" program that does.
                  >>
                  >
                  And how is changing from push_back to insert going to make this code not
                  work right?
                  >
                  >Hoare's Law (also attributed to Knuth): "Premature optimization is the
                  >root of all evil".
                  >
                  >
                  Okay, let's all use bubble sort until we can prove that quicksort will
                  be a better choice.
                  >
                  Sometimes optimization without measurement is perfectly appropriate.
                  When there's a choice of two ways to do something and one is slower,
                  choose the other.
                  >
                  Agreed, maybe the quote should be changed to "Premature
                  micro-optimisation is the root of all evil" to differentiate between
                  code tweaks and choice of algorithm.

                  --
                  Ian Collins.

                  Comment

                  • Alf P. Steinbach

                    #10
                    Re: combining two vectors

                    * Ian Collins:
                    Pete Becker wrote:
                    >red floyd wrote:
                    >>
                    >>Hoare's Law (also attributed to Knuth): "Premature optimization is the
                    >>root of all evil".
                    >>
                    >Okay, let's all use bubble sort until we can prove that quicksort will
                    >be a better choice.
                    >>
                    >Sometimes optimization without measurement is perfectly appropriate.
                    >When there's a choice of two ways to do something and one is slower,
                    >choose the other.
                    >>
                    Agreed, maybe the quote should be changed to "Premature
                    micro-optimisation is the root of all evil" to differentiate between
                    code tweaks and choice of algorithm.
                    Isn't that an optimization?

                    --
                    A: Because it messes up the order in which people normally read text.
                    Q: Why is it such a bad thing?
                    A: Top-posting.
                    Q: What is the most annoying thing on usenet and in e-mail?

                    Comment

                    • Ian Collins

                      #11
                      Re: combining two vectors

                      Alf P. Steinbach wrote:
                      * Ian Collins:
                      >
                      >Pete Becker wrote:
                      >>
                      >>red floyd wrote:
                      >>>
                      >>>Hoare's Law (also attributed to Knuth): "Premature optimization is the
                      >>>root of all evil".
                      >>>
                      >>>
                      >>Okay, let's all use bubble sort until we can prove that quicksort will
                      >>be a better choice.
                      >>>
                      >>Sometimes optimization without measurement is perfectly appropriate.
                      >>When there's a choice of two ways to do something and one is slower,
                      >>choose the other.
                      >>>
                      >Agreed, maybe the quote should be changed to "Premature
                      >micro-optimisation is the root of all evil" to differentiate between
                      >code tweaks and choice of algorithm.
                      >
                      >
                      Isn't that an optimization?
                      >
                      More like a design decision.

                      --
                      Ian Collins.

                      Comment

                      • Alf P. Steinbach

                        #12
                        Re: combining two vectors

                        * Ian Collins:
                        Alf P. Steinbach wrote:
                        >* Ian Collins:
                        >>
                        >>Pete Becker wrote:
                        >>>
                        >>>red floyd wrote:
                        >>>>
                        >>>>Hoare's Law (also attributed to Knuth): "Premature optimization is the
                        >>>>root of all evil".
                        >>>>
                        >>>Okay, let's all use bubble sort until we can prove that quicksort will
                        >>>be a better choice.
                        >>>>
                        >>>Sometimes optimization without measurement is perfectly appropriate.
                        >>>When there's a choice of two ways to do something and one is slower,
                        >>>choose the other.
                        >>>>
                        >>Agreed, maybe the quote should be changed to "Premature
                        >>micro-optimisation is the root of all evil" to differentiate between
                        >>code tweaks and choice of algorithm.
                        >>
                        >Isn't that an optimization?
                        >>
                        More like a design decision.
                        Well, yes, but isn't that an optimization? <g>

                        --
                        A: Because it messes up the order in which people normally read text.
                        Q: Why is it such a bad thing?
                        A: Top-posting.
                        Q: What is the most annoying thing on usenet and in e-mail?

                        Comment

                        Working...