通过 size_t 索引迭代到 boost::multi_index 中的顺序位置?

Posted

技术标签:

【中文标题】通过 size_t 索引迭代到 boost::multi_index 中的顺序位置?【英文标题】:Iterate to sequential position in boost::multi_index by size_t index? 【发布时间】:2011-05-05 12:25:43 【问题描述】:

我刚刚开始使用 boost multi_index,到目前为止,我有一个包含序列类型和复合键无序哈希的容器。

我想要做的是访问已排序的容器,就像它是 std::vector 或 std::list 一样。我的意思是使用size_t index

下面是我的代码:

// tags
struct linear  ;
struct semantic  ;
struct semantic_and_index  ;

// typedefs for multi_index
typedef boost::multi_index::sequenced< 
    boost::multi_index::tag<linear>
> LinearIndex;

typedef boost::multi_index::composite_key<
    CVertexElement,
    boost::multi_index::const_mem_fun<CVertexElement, Buffer::VertexSemantic, &CVertexElement::GetVertexSemantic>,
    boost::multi_index::const_mem_fun<CVertexElement, UInt, &CVertexElement::GetSemanticIndex> 
> CompositeSemanticIndex;

typedef boost::multi_index::hashed_non_unique<
    boost::multi_index::tag<semantic_and_index>,
    CompositeSemanticIndex
> SemanticAndIDIndex;

typedef boost::multi_index::hashed_non_unique<
    boost::multi_index::tag<semantic>,
    boost::multi_index::const_mem_fun<CVertexElement, Buffer::VertexSemantic, &CVertexElement::GetVertexSemantic> 
> SemanticIndex;

class CVertexFormat

public:
    typedef boost::multi_index::multi_index_container <
        CVertexElementPtr,
        boost::multi_index::indexed_by <
            LinearIndex,
            SemanticAndIDIndex,
            SemanticIndex
        > // index_by
    > ElementContainer; 

      // etc...

protected:
    ElementContainer m_elements;
;

我指的函数是:

// this function fails! :(
CVertexElementPtr CVertexFormat::GetElement(size_t index) const 

    //sequenced_index.
    typedef ElementContainer::index<linear>::type element_by_linear;
    const element_by_linear& index_type = m_elements.get<linear>();

    if ( index < index_type.size() )
    
        auto itor = index_type.begin();
        for (UInt i = 0; i < index_type.size(); ++i)
            ++itor;

        const CVertexElementPtr& pElement = (*itor);        
        return pElement;
    
    else
    
        assert(!"Invalid index called for GetElement");
        return CVertexElementPtr();
    

vs2010报错图(看右边的watch窗口):

High res screen shot

【问题讨论】:

究竟是什么失败了?你遇到了什么错误? 迭代器由于某种原因无效。当我调试应用程序时,它说m_elements 中有 2 个节点。但是对于index = 0,从index_type.begin() 返回的itor 无效...我不知道它怎么会无效?如果可以的话,我会在问题上附上屏幕截图。 其实我刚刚解决了。那是for (UInt i = 0; i &lt; index_type.size(); ++i)。它实际上应该是for (UInt i = 0; i &lt; index; ++i)。看来那杯咖啡确实对我有用。 所以发布这个作为你自己的答案,并接受它 【参考方案1】:

问题已通过更改函数CVertexElementPtr CVertexFormat::GetElement(size_t index) const 解决。

正确的函数是:

CVertexElementPtr CVertexFormat::GetElement(size_t index) const

    //sequenced_index.
    typedef ElementContainer::index<linear>::type element_by_linear;
    const element_by_linear& index_type = m_elements.get<linear>();

    size_t size = index_type.size();
    if ( index < size )
    
        auto itor = index_type.begin();
        for (UInt i = 0; i < index; ++i)
            ++itor;

        const CVertexElementPtr& pElement = (*itor);        
        return pElement;
    
    else
    
        assert( false && ieS("Invalid index called for GetElement") );
        return CVertexElementPtr();
    

【讨论】:

以上是关于通过 size_t 索引迭代到 boost::multi_index 中的顺序位置?的主要内容,如果未能解决你的问题,请参考以下文章

Python for循环通过序列索引迭代

C环形buff

C环形buff

如何通过 FOR 循环进行此继续迭代。停留在索引 5

如何在循环缓冲区中从头到尾迭代而不分支

C++,最佳实践,int 还是 size_t? [复制]