如何从对象中获取STL容器的类型?例如,我有一个container
变量,我知道它是std::vector<some type>
。我需要使用迭代器迭代容器。有没有办法在不知道容器类型的情况下声明迭代器?
我当然可以从代码中获取类型,但我很乐意在不使用类型的情况下执行此操作。我也没有使用C ++ 11。
答案 0 :(得分:8)
C ++ 11有一些很简单的方法:
auto it = container.begin();
或等效地:
decltype(container.begin()) it = container.begin();
甚至:
decltype(container)::iterator it = container.begin();
尽管如此,即使您不能使用类型推导,您也不应该处于无法以某种形式或类型参数(可能涉及模板参数)输入类型的情况。如果编译器知道它是什么类型,那么你也是。
答案 1 :(得分:2)
typedef std::vector<some_type> container;
for(container::const_iterator i = container.begin(); i != container.end(); ++i)
// ...
你也有iterator typedef(你可以用而不是const_iterator)。如果您使用的是c ++ 11,请使用auto或for(auto& value: container) { ... }
表单。
答案 2 :(得分:1)
从类型中获取它:
container::value_type.
对于关联容器; container::mapped_type
(container :: value_type对应于pair)。这是根据C ++标准的第23章。
使用boost::is_same来比较类型
从对象实例中获取它:
auto it = container.begin();
答案 3 :(得分:0)
一种方法是使用模板:
template <class container>
void dosomething(container &c) {
typename container::iterator it = c.begin();
typename container::iterator end = c.end();
while (it != end)
dosomething_with(*it);
}
根据具体情况,auto
也可能有用:
for (auto it = container.begin(); it != container.end(); ++it)
dosomething_with(*it);
后者需要C ++ 11,但前者在C ++ 98/03中可用。