2

我有一个字符串向量。我希望能够在该向量中搜索字符串,如果我在向量中找到匹配项,我希望能够返回位置,例如向量中项目的向量索引。

这是我试图解决问题的代码:

enum ActorType  { at_none, at_plane, at_sphere, at_cylinder, at_cube, at_skybox, at_obj, at_numtypes };

class ActorTypes
{
private:
    std::vector<std::string>  _sActorTypes;

public:
    ActorTypes()
    {
        // initializer lists don't work in vs2012 :/
        using std::string;
        _sActorTypes.push_back( string("plane") );
        _sActorTypes.push_back( string("sphere") );
        _sActorTypes.push_back( string("cylinder") );
        _sActorTypes.push_back( string("cube") );
        _sActorTypes.push_back( string("skybox") );
        _sActorTypes.push_back( string("obj") );
    }

    const ActorType FindType( const std::string & s )
    {
        auto itr = std::find( _sActorTypes.cbegin(), _sActorTypes.cend(), s );

        uint32_t nIndex = ???;

        // I want to be able to do the following
        return (ActorType) nIndex;
    }       
};

我知道我可以只编写一个 for 循环并返回我找到匹配项的 for 循环索引,但我想知道更一般的情况 - 我可以获得 vector::iterator 的索引值吗?

4

2 回答 2

8

使用std::distance

uint32_t index = std::distance(std::begin(_sActorTypes), itr);

find不过,您应该首先检查to的返回值end(),以确保它确实被找到。您也可以使用减法,因为std::vector使用随机访问迭代器,但减法不适用于所有容器,例如std::list使用双向迭代器的容器。

于 2012-11-28T21:26:23.187 回答
4

您可以使用std::distance

auto itr = std::find( _sActorTypes.cbegin(), _sActorTypes.cend(), s );
uint32_t nIndex = std::distance(_sActorTypes.cbegin(), itr);
于 2012-11-28T21:26:34.707 回答