【问题标题】:How to traverse a recursive variant vector using Boost C++如何使用 Boost C++ 遍历递归变体向量
【发布时间】:2013-04-01 04:37:42
【问题描述】:
我想构建一个构造如下的向量树
struct myStruct {
int a;
string b;
};
typedef boost::make_recursive_variant<
myStruct *
, std::vector< boost::recursive_variant_ >
>::type myStruct_tree;
如果我附加多个向量,以及这些向量中的向量,我将如何使用某种位置向量遍历树
vector<int>
它定位向量指针树中定义的每个向量/子向量中的对象位置。
【问题讨论】:
标签:
c++
search
boost
tree
【解决方案1】:
我不是 100% 确定我理解你的问题,所以如果我有什么问题,请澄清。我假设向量是一条路径,每个元素都给出要移动到的元素的索引。考虑到这一点,我会尝试这样的事情:
myStruct_tree t = ...;
myStruct_tree* tit = &t;
for(iterator pit=path.begin(); pit!=path.end(); ++pit)
{
// retrieve branches at current position
vector<myStruct_tree>& vec = get<2>(*tit);
// get next position in tree, will throw on bad index
tit = &vec.at(*pit);
}
assert(tit);
// retrieve the leaf at the final position
myStruct* res = get<1>(*tit);
注意事项:
- 对我来说,使用无符号整数作为索引会更自然一些。
- vector::at() 在超出范围时引发异常。
- 我还没有查找如何获取变体元素的确切语法。对于我上面使用的版本
get<1>(*tit);,我的意思是检索第一个元素的版本(即 myStruct 指针)。此外,它应该是返回引用或抛出以处理错误的那个。
- 考虑用您自己的代码替换范围检查,以提供更好的诊断。我这样做不是为了保持算法结构清晰。