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
- 可变尺寸
- 异构(不同类型的数据).
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
相关文章