0

パス方法論を使用してリストの既知のインデックスにアクセスする便利な方法があるかどうか疑問に思っていました。

私の夢のメソッド

float v = pt.get<float>("root.list[0]);

現在知られている方法 (またはそれに類するもの)

 ptree::value_type listElement;
 BOOST_FOREACH(listElement,tree.get_child("root.list")){
                return listElement.second.get<float>();
            }

リストのフォーマット(json)

{
root:{
 list:[1,2,3,4,5]
}
}
4

1 に答える 1

3

を使用して、リスト内の要素の範囲にアクセスできるはずですboost::property_tree::equal_range。使用しているフォーマットの JSON では、リスト内の各項目に関連付けられた name 要素はありません。これは、範囲内の子要素にアクセスする前に、親ノードを取得する必要があることを意味します。

以下のコードは、適応できる大雑把な例です。

入力 Json ファイル (.json) :

{
    "root" :
    {
        "list" : [1,2,3,4,5]
    }
}

リストの n 番目の要素を出力する関数:

void display_list_elem( const ptree& pt, unsigned idx )
{
    // note: the node elements have no name value, ergo we cannot get
    // them directly, therefor we must access the parent node,
    // and then get the children separately

    // access the list node
    BOOST_AUTO( listNode,  pt.get_child("root.list") );


    // get the children, i.e. the list elements
    std::pair< ptree::const_assoc_iterator,
               ptree::const_assoc_iterator > bounds = listNode.equal_range( "" );


    std::cout << "Size of list : " << std::distance( bounds.first, bounds.second ) << "\n";
    if ( idx > std::distance( bounds.first, bounds.second ) )
    {
        std::cerr << "ERROR Index too big\n";
        return;
    }
    else
    {
        std::advance( bounds.first, idx );

        std::cout << "Value @ idx[" << idx << "] = " 
                  << bounds.first->second.get_value<std::string>() << "\n";
    }

    std::cout << "Displaying bounds....\n";
    display_ptree( bounds.first->second, 10 );
}
于 2012-11-26T16:56:11.573 に答える