通过 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 < index_type.size(); ++i)
。它实际上应该是for (UInt i = 0; i < 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 中的顺序位置?的主要内容,如果未能解决你的问题,请参考以下文章