• <tfoot id='SEFy8'></tfoot>

      <i id='SEFy8'><tr id='SEFy8'><dt id='SEFy8'><q id='SEFy8'><span id='SEFy8'><b id='SEFy8'><form id='SEFy8'><ins id='SEFy8'></ins><ul id='SEFy8'></ul><sub id='SEFy8'></sub></form><legend id='SEFy8'></legend><bdo id='SEFy8'><pre id='SEFy8'><center id='SEFy8'></center></pre></bdo></b><th id='SEFy8'></th></span></q></dt></tr></i><div id='SEFy8'><tfoot id='SEFy8'></tfoot><dl id='SEFy8'><fieldset id='SEFy8'></fieldset></dl></div>
        <bdo id='SEFy8'></bdo><ul id='SEFy8'></ul>

      <small id='SEFy8'></small><noframes id='SEFy8'>

    1. <legend id='SEFy8'><style id='SEFy8'><dir id='SEFy8'><q id='SEFy8'></q></dir></style></legend>

        C++ 中的异构容器

        时间:2024-05-12

          <legend id='OvLkh'><style id='OvLkh'><dir id='OvLkh'><q id='OvLkh'></q></dir></style></legend>
          • <bdo id='OvLkh'></bdo><ul id='OvLkh'></ul>
          • <small id='OvLkh'></small><noframes id='OvLkh'>

              <i id='OvLkh'><tr id='OvLkh'><dt id='OvLkh'><q id='OvLkh'><span id='OvLkh'><b id='OvLkh'><form id='OvLkh'><ins id='OvLkh'></ins><ul id='OvLkh'></ul><sub id='OvLkh'></sub></form><legend id='OvLkh'></legend><bdo id='OvLkh'><pre id='OvLkh'><center id='OvLkh'></center></pre></bdo></b><th id='OvLkh'></th></span></q></dt></tr></i><div id='OvLkh'><tfoot id='OvLkh'></tfoot><dl id='OvLkh'><fieldset id='OvLkh'></fieldset></dl></div>

                    <tbody id='OvLkh'></tbody>
                  <tfoot id='OvLkh'></tfoot>
                • 本文介绍了C++ 中的异构容器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我看到了这个漂亮的图形,它根据不同的数据要求对适合哪种 STL 容器进行分类,例如:

                  I saw this nice graphic which classifies which STL container would suit based on different requirements of data such as:

                  -- 固定尺寸与可变尺寸

                  -- Fixed Size Vs Variable size

                  -- 同类型数据与不同类型数据

                  -- Data of same tyme Vs different type

                  -- 排序与未排序的数据

                  -- Sorted Vs unsorted data

                  -- 顺序访问与随机访问

                  -- Sequential Vs random access

                  http://plasmahh.projectiwear.org/cce_clean.svg

                  我注意到在那个图像中,C++ STL 没有容器

                  I notice in that image, that C++ STL there is no container which is

                  1. 可变尺寸
                  2. 异构(不同类型的数据).

                  C++ 没有这方面的东西吗?

                  Doesn't C++ have something for this?

                  PS - 容器的不同属性可以有很多排列,而 STL 中可能没有提供许多其他排列.

                  PS - There can be many permutations made out the different properties of the containers and many others too might not be provided in STL.

                  推荐答案

                  一般来说,C++ 容器被设计为使用模板来保存单一类型的对象.如果你想要从一种类型派生的不同类型,你可以存储一个指针容器(我猜你也可以有一个 void* 容器......)例如std::vector.

                  Well generally C++ Containers are designed to hold objects of a single type using templates. If you want different types that are all derived from one type you can store a container of pointers (I guess you could also have a container of void* to anything...) e.g. std::vector<MyBaseType*>.

                  如果你想要完全不相关的类型,你可以存储可以安全引用那些其他类型的对象,例如 boost::any.

                  If you want completely unrelated types, you can store objects that can safely reference those other types, such as boost::any.

                  http://www.boost.org/doc/libs/1_47_0/doc/html/any.html

                  boost 网站上的一些例子:

                  Some examples off the boost site:

                  #include <list>
                  #include <boost/any.hpp>
                  
                  using boost::any_cast;
                  typedef std::list<boost::any> many;
                  
                  void append_int(many & values, int value)
                  {
                      boost::any to_append = value;
                      values.push_back(to_append);
                  }
                  
                  void append_string(many & values, const std::string & value)
                  {
                      values.push_back(value);
                  }
                  
                  bool is_int(const boost::any & operand)
                  {
                      return operand.type() == typeid(int);
                  }
                  bool is_char_ptr(const boost::any & operand)
                  {
                      try
                      {
                          any_cast<const char *>(operand);
                          return true;
                      }
                      catch(const boost::bad_any_cast &)
                      {
                          return false;
                      }
                  }
                  

                  boost::variant 类似,但您指定所有允许的类型,而不是允许容器中的任何类型.

                  boost::variant is similar, but you specify all the allowed types, rather than allowing any type in your container.

                  http://www.boost.org/doc/libs/1_47_0/doc/html/variant.html

                  std::vector< boost::variant<unsigned, std::string> > vec;
                  vec.push_back( 44);
                  vec.push_back( "str" );
                  vec.push_back( SomthingElse(55, 65) ); //not allowed
                  

                  这篇关于C++ 中的异构容器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:为什么 std::queue::pop 不返回值.? 下一篇:标准定义的 std::array 的大小

                  相关文章

                  <tfoot id='cc376'></tfoot>
                    <bdo id='cc376'></bdo><ul id='cc376'></ul>
                  1. <legend id='cc376'><style id='cc376'><dir id='cc376'><q id='cc376'></q></dir></style></legend>
                    <i id='cc376'><tr id='cc376'><dt id='cc376'><q id='cc376'><span id='cc376'><b id='cc376'><form id='cc376'><ins id='cc376'></ins><ul id='cc376'></ul><sub id='cc376'></sub></form><legend id='cc376'></legend><bdo id='cc376'><pre id='cc376'><center id='cc376'></center></pre></bdo></b><th id='cc376'></th></span></q></dt></tr></i><div id='cc376'><tfoot id='cc376'></tfoot><dl id='cc376'><fieldset id='cc376'></fieldset></dl></div>

                  2. <small id='cc376'></small><noframes id='cc376'>