2

如何从对象中获取 STL 容器的类型?例如,我有一个container变量,我知道它是std::vector<some type>. 我需要使用迭代器迭代容器。有没有办法在不知道容器类型的情况下声明迭代器?

我当然可以从代码中获取类型,但我很想在不使用类型的情况下做到这一点。我也没有使用 C++11。

4

4 回答 4

9

C++11 有一些不错的简单方法:

auto it = container.begin();

或等效地:

decltype(container.begin()) it = container.begin();

甚至:

decltype(container)::iterator it = container.begin();

尽管如此,即使您不能使用类型推导,您也不应该处于无法以某种形式输入类型的情况(可能涉及模板参数)。如果编译器知道它是什么类型,那么你也知道。

于 2013-03-21T14:50:05.163 回答
2
typedef std::vector<some_type> container;

for(container::const_iterator i = container.begin(); i != container.end(); ++i)
    // ... 

你也有迭代器 typedef(你可以用它来代替 const_iterator)。如果您使用的是 c++11,请使用 auto 或for(auto& value: container) { ... }表单。

于 2013-03-21T14:48:08.323 回答
1

从类型中获取它:

container::value_type.

对于关联容器;container::mapped_type(container::value_type 对应对)。它符合 C++ 标准的第 23 章。

使用boost::is_same比较类型

从对象实例中获取它:

auto it = container.begin();
于 2013-03-21T14:49:55.833 回答
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 中可用。

于 2013-03-21T14:50:40.980 回答