5

たとえば、シェルでこれを行うと

> db.numbers.save( { name: "fibonacci", arr: [0, 1, 1, 2, 3, 5, 8, 13, 21] } )

arr次に、C++ プログラムに参加したいと思います。

BSONObjを取得nameした後、取得できます

std::string name = p.getStringField("name");

pBSON オブジェクトです。

しかし、配列から要素を取得して std::vector に保存する正しい方法は何ですか?

編集:

さらに調査した後、BSONElement doxygenのドキュメントを見つけてこれを作成しました。

std::vector<int> arr;
std::vector<BSONElement> v = p.getField("arr").Array();
for(std::vector<BSONElement>::iterator it = v.begin(); it != v.end(); ++it)
    arr.push_back(it->numberInt());

しかし、それが正しい方法であるかどうかはまだわかりません。

4

1 に答える 1

6

他の 2 つの方法:

// this way is easy but requires exact type match (no int64->int32 conversion)
std::vector<int> ints;
p.getObjectField("arr").vals(ints); // skips non int values
p.getObjectField("arr").Vals(ints); // asserts on non int values

また

// this way is more common and does the conversion between numeric types
vector<int> v;
BSONObjIterator fields (p.getObjectField("arr"));
while(fields.more()) {
    v.push_back(fields.next().numberInt());
}

//same as above but using BSONForEach macro
BSONForEach(e, p.getObjectField("arr")) {
    v.push_back(e.numberInt());
}

または、出力をvector<BSONElement>そのままにして直接使用することもできますが、その場合、BSONObj がベクトルよりも長く存続することを確認する必要があります。

于 2012-05-04T16:36:43.727 に答える