Adding empty element to declared container without declaring type of element












14















When we use a complicated container in C++, like



std::vector<std::map<std::string, std::set<std::string>>> table;


The only way to add an empty map (which may represent a row or column) is to initialize a new element and push it back. For example with



table.push_back(std::map<std::string, std::set<std::string>>());


Is there any way to avoid redeclaring the type, and just adding the correct typed element?










share|improve this question





























    14















    When we use a complicated container in C++, like



    std::vector<std::map<std::string, std::set<std::string>>> table;


    The only way to add an empty map (which may represent a row or column) is to initialize a new element and push it back. For example with



    table.push_back(std::map<std::string, std::set<std::string>>());


    Is there any way to avoid redeclaring the type, and just adding the correct typed element?










    share|improve this question



























      14












      14








      14








      When we use a complicated container in C++, like



      std::vector<std::map<std::string, std::set<std::string>>> table;


      The only way to add an empty map (which may represent a row or column) is to initialize a new element and push it back. For example with



      table.push_back(std::map<std::string, std::set<std::string>>());


      Is there any way to avoid redeclaring the type, and just adding the correct typed element?










      share|improve this question
















      When we use a complicated container in C++, like



      std::vector<std::map<std::string, std::set<std::string>>> table;


      The only way to add an empty map (which may represent a row or column) is to initialize a new element and push it back. For example with



      table.push_back(std::map<std::string, std::set<std::string>>());


      Is there any way to avoid redeclaring the type, and just adding the correct typed element?







      c++ c++11






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Mar 25 at 10:41









      Mohammad Usman

      21.5k134859




      21.5k134859










      asked Mar 25 at 6:35









      VineetVineet

      359411




      359411
























          4 Answers
          4






          active

          oldest

          votes


















          33














          From CLion's IntelliSense, I later found that one useful method is emplace_back(). This constructs a new object of correct type and adds it to the end of the vector.



          table.emplace_back();





          share|improve this answer

































            24














            You can take advantage of copy-list-initialization (since C++11) and just write



            table.push_back({});





            share|improve this answer

































              10














              Before C++11 sometimes I use x.resize(x.size()+1), in C++11 or later you can use x.push_back({}).






              share|improve this answer































                5














                Though the other answers are correct, I will add that if you couldn't take that approach, you could have benefitted from declaring some type aliases to shorten that container type name.



                I can of course only guess at the logical meaning of your containers, which is another thing that this fixes!



                 using PhilosopherNameType = std::string;
                using NeighboursType = std::set<PhilosopherNameType>;
                using NeighbourMapType = std::map<PhilosopherNameType, NeighboursType>;

                std::vector<NeighbourMapType> table;
                table.push_back(NeighbourMapType());


                I mention this because you can likely still benefit from this in other places.






                share|improve this answer



















                • 2





                  agreed. Along the same lines are the types that the STL gives you (vector::value_type iirc)

                  – sudo rm -rf slash
                  Mar 26 at 8:01












                Your Answer






                StackExchange.ifUsing("editor", function () {
                StackExchange.using("externalEditor", function () {
                StackExchange.using("snippets", function () {
                StackExchange.snippets.init();
                });
                });
                }, "code-snippets");

                StackExchange.ready(function() {
                var channelOptions = {
                tags: "".split(" "),
                id: "1"
                };
                initTagRenderer("".split(" "), "".split(" "), channelOptions);

                StackExchange.using("externalEditor", function() {
                // Have to fire editor after snippets, if snippets enabled
                if (StackExchange.settings.snippets.snippetsEnabled) {
                StackExchange.using("snippets", function() {
                createEditor();
                });
                }
                else {
                createEditor();
                }
                });

                function createEditor() {
                StackExchange.prepareEditor({
                heartbeatType: 'answer',
                autoActivateHeartbeat: false,
                convertImagesToLinks: true,
                noModals: true,
                showLowRepImageUploadWarning: true,
                reputationToPostImages: 10,
                bindNavPrevention: true,
                postfix: "",
                imageUploader: {
                brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                allowUrls: true
                },
                onDemand: true,
                discardSelector: ".discard-answer"
                ,immediatelyShowMarkdownHelp:true
                });


                }
                });














                draft saved

                draft discarded


















                StackExchange.ready(
                function () {
                StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55332359%2fadding-empty-element-to-declared-container-without-declaring-type-of-element%23new-answer', 'question_page');
                }
                );

                Post as a guest















                Required, but never shown

























                4 Answers
                4






                active

                oldest

                votes








                4 Answers
                4






                active

                oldest

                votes









                active

                oldest

                votes






                active

                oldest

                votes









                33














                From CLion's IntelliSense, I later found that one useful method is emplace_back(). This constructs a new object of correct type and adds it to the end of the vector.



                table.emplace_back();





                share|improve this answer






























                  33














                  From CLion's IntelliSense, I later found that one useful method is emplace_back(). This constructs a new object of correct type and adds it to the end of the vector.



                  table.emplace_back();





                  share|improve this answer




























                    33












                    33








                    33







                    From CLion's IntelliSense, I later found that one useful method is emplace_back(). This constructs a new object of correct type and adds it to the end of the vector.



                    table.emplace_back();





                    share|improve this answer















                    From CLion's IntelliSense, I later found that one useful method is emplace_back(). This constructs a new object of correct type and adds it to the end of the vector.



                    table.emplace_back();






                    share|improve this answer














                    share|improve this answer



                    share|improve this answer








                    edited Mar 25 at 7:12

























                    answered Mar 25 at 6:51









                    VineetVineet

                    359411




                    359411

























                        24














                        You can take advantage of copy-list-initialization (since C++11) and just write



                        table.push_back({});





                        share|improve this answer






























                          24














                          You can take advantage of copy-list-initialization (since C++11) and just write



                          table.push_back({});





                          share|improve this answer




























                            24












                            24








                            24







                            You can take advantage of copy-list-initialization (since C++11) and just write



                            table.push_back({});





                            share|improve this answer















                            You can take advantage of copy-list-initialization (since C++11) and just write



                            table.push_back({});






                            share|improve this answer














                            share|improve this answer



                            share|improve this answer








                            edited Mar 25 at 6:46

























                            answered Mar 25 at 6:37









                            songyuanyaosongyuanyao

                            93.9k11182249




                            93.9k11182249























                                10














                                Before C++11 sometimes I use x.resize(x.size()+1), in C++11 or later you can use x.push_back({}).






                                share|improve this answer




























                                  10














                                  Before C++11 sometimes I use x.resize(x.size()+1), in C++11 or later you can use x.push_back({}).






                                  share|improve this answer


























                                    10












                                    10








                                    10







                                    Before C++11 sometimes I use x.resize(x.size()+1), in C++11 or later you can use x.push_back({}).






                                    share|improve this answer













                                    Before C++11 sometimes I use x.resize(x.size()+1), in C++11 or later you can use x.push_back({}).







                                    share|improve this answer












                                    share|improve this answer



                                    share|improve this answer










                                    answered Mar 25 at 6:49









                                    65026502

                                    87.7k13115218




                                    87.7k13115218























                                        5














                                        Though the other answers are correct, I will add that if you couldn't take that approach, you could have benefitted from declaring some type aliases to shorten that container type name.



                                        I can of course only guess at the logical meaning of your containers, which is another thing that this fixes!



                                         using PhilosopherNameType = std::string;
                                        using NeighboursType = std::set<PhilosopherNameType>;
                                        using NeighbourMapType = std::map<PhilosopherNameType, NeighboursType>;

                                        std::vector<NeighbourMapType> table;
                                        table.push_back(NeighbourMapType());


                                        I mention this because you can likely still benefit from this in other places.






                                        share|improve this answer



















                                        • 2





                                          agreed. Along the same lines are the types that the STL gives you (vector::value_type iirc)

                                          – sudo rm -rf slash
                                          Mar 26 at 8:01
















                                        5














                                        Though the other answers are correct, I will add that if you couldn't take that approach, you could have benefitted from declaring some type aliases to shorten that container type name.



                                        I can of course only guess at the logical meaning of your containers, which is another thing that this fixes!



                                         using PhilosopherNameType = std::string;
                                        using NeighboursType = std::set<PhilosopherNameType>;
                                        using NeighbourMapType = std::map<PhilosopherNameType, NeighboursType>;

                                        std::vector<NeighbourMapType> table;
                                        table.push_back(NeighbourMapType());


                                        I mention this because you can likely still benefit from this in other places.






                                        share|improve this answer



















                                        • 2





                                          agreed. Along the same lines are the types that the STL gives you (vector::value_type iirc)

                                          – sudo rm -rf slash
                                          Mar 26 at 8:01














                                        5












                                        5








                                        5







                                        Though the other answers are correct, I will add that if you couldn't take that approach, you could have benefitted from declaring some type aliases to shorten that container type name.



                                        I can of course only guess at the logical meaning of your containers, which is another thing that this fixes!



                                         using PhilosopherNameType = std::string;
                                        using NeighboursType = std::set<PhilosopherNameType>;
                                        using NeighbourMapType = std::map<PhilosopherNameType, NeighboursType>;

                                        std::vector<NeighbourMapType> table;
                                        table.push_back(NeighbourMapType());


                                        I mention this because you can likely still benefit from this in other places.






                                        share|improve this answer













                                        Though the other answers are correct, I will add that if you couldn't take that approach, you could have benefitted from declaring some type aliases to shorten that container type name.



                                        I can of course only guess at the logical meaning of your containers, which is another thing that this fixes!



                                         using PhilosopherNameType = std::string;
                                        using NeighboursType = std::set<PhilosopherNameType>;
                                        using NeighbourMapType = std::map<PhilosopherNameType, NeighboursType>;

                                        std::vector<NeighbourMapType> table;
                                        table.push_back(NeighbourMapType());


                                        I mention this because you can likely still benefit from this in other places.







                                        share|improve this answer












                                        share|improve this answer



                                        share|improve this answer










                                        answered Mar 25 at 17:12









                                        Lightness Races in OrbitLightness Races in Orbit

                                        295k54477812




                                        295k54477812








                                        • 2





                                          agreed. Along the same lines are the types that the STL gives you (vector::value_type iirc)

                                          – sudo rm -rf slash
                                          Mar 26 at 8:01














                                        • 2





                                          agreed. Along the same lines are the types that the STL gives you (vector::value_type iirc)

                                          – sudo rm -rf slash
                                          Mar 26 at 8:01








                                        2




                                        2





                                        agreed. Along the same lines are the types that the STL gives you (vector::value_type iirc)

                                        – sudo rm -rf slash
                                        Mar 26 at 8:01





                                        agreed. Along the same lines are the types that the STL gives you (vector::value_type iirc)

                                        – sudo rm -rf slash
                                        Mar 26 at 8:01


















                                        draft saved

                                        draft discarded




















































                                        Thanks for contributing an answer to Stack Overflow!


                                        • Please be sure to answer the question. Provide details and share your research!

                                        But avoid



                                        • Asking for help, clarification, or responding to other answers.

                                        • Making statements based on opinion; back them up with references or personal experience.


                                        To learn more, see our tips on writing great answers.




                                        draft saved


                                        draft discarded














                                        StackExchange.ready(
                                        function () {
                                        StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55332359%2fadding-empty-element-to-declared-container-without-declaring-type-of-element%23new-answer', 'question_page');
                                        }
                                        );

                                        Post as a guest















                                        Required, but never shown





















































                                        Required, but never shown














                                        Required, but never shown












                                        Required, but never shown







                                        Required, but never shown

































                                        Required, but never shown














                                        Required, but never shown












                                        Required, but never shown







                                        Required, but never shown







                                        Popular posts from this blog

                                        If I really need a card on my start hand, how many mulligans make sense? [duplicate]

                                        Alcedinidae

                                        Can an atomic nucleus contain both particles and antiparticles? [duplicate]