我想用BOOST FOREACH复制以下内容
std::vector<int>::const_iterator i1;
std::vector<int>::const_iterator i2;
for( i1 = v1.begin(), i2 = v2.begin();
i1 < v1.end() && i2 < v2.end();
++i1, ++i2 )
{
doSomething( *i1, *i2 );
}
Run Code Online (Sandbox Code Playgroud) 首先,我要说我认为我应该怎么做但我的代码不会以任何方式编译我尝试.我的假设基于这个空ptree技巧的官方例子.在那里你可以找到下一行:
const ptree &settings = pt.get_child("settings", empty_ptree<ptree>());
Run Code Online (Sandbox Code Playgroud)
这表明从(或应该)可以从ptree中获取subptree.
所以我假设我们可以用BOOST_FOREACH这样的方式迭代到ptree :
BOOST_FOREACH(const boost::property_tree::ptree &v,
config.get_child("servecies"))
{
}
Run Code Online (Sandbox Code Playgroud)
但我得到下一个错误:
错误1错误C2440:'初始化':无法从'std :: pair <_Ty1,_Ty2>'转换为'const boost :: property_tree :: ptree&'
或者如果我尝试
BOOST_FOREACH(boost::property_tree::ptree &v,
config.get_child("servecies", boost::property_tree::empty_ptree<boost::property_tree::ptree>()))
{
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
错误1错误C2039:'empty_ptree':不是'boost :: property_tree'的成员
那我该怎么做:如何通过Boost Ptree迭代并得到子Ptrees?
更新: 我也试过这样的代码
BOOST_FOREACH(boost::property_tree::ptree::value_type &v,
config.get_child("path.to.array_of_objects"))
{
std::cout << "First data: " << v.first.data() << std::endl;
boost::property_tree::ptree subtree = (boost::property_tree::ptree) v.second ;
BOOST_FOREACH(boost::property_tree::ptree::value_type &vs,
subtree)
{
std::cout << "Sub data: " << vs.first.data() << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
这编译,不会抛出任何exeptions但不会cout任何 …
是否有可能BOOST_FOREACH用"纯"C++ 11等效替换本例中的?
#include <map>
#include <functional>
#include <boost/foreach.hpp>
#include <iostream>
int main() {
std::map<int, std::string> map = {std::make_pair(1,"one"), std::make_pair(2,"two")};
int k;
std::string v;
BOOST_FOREACH(std::tie(k, v), map) {
std::cout << "k=" << k << " - " << v << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
关键特性是将键/值对保留在k和的引用中v.
我试过了:
for(std::tie(k,v) : map)
{
std::cout << "k=" << k << " - " << v << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
和
auto i = std::tie(k,v);
for(i : map)
{
std::cout << "k=" …Run Code Online (Sandbox Code Playgroud) 你可以使用boost :: filesystem和BOOST_FOREACH迭代目录中的所有文件吗?我试过了
path dirPath = ...
int fileCount = 0;
BOOST_FOREACH(const path& filePath, dirPath)
if(is_regular_file(filePath))
++fileCount;
Run Code Online (Sandbox Code Playgroud)
此代码编译,运行,但不会产生所需的结果.
我知道boost或编译器应该是最后的责任,但我在这里看不到另一种解释.我正在使用msvc 2008 SP1并提升1.43.
在下面的代码片段中,执行永远不会离开第三个 BOOST_FOREACH循环
typedef Graph<unsigned, unsigned>::VertexIterator Iter;
Graph<unsigned, unsigned> g;
g.createVertex(0x66);
// works fine
Iter it = g.getVertices().first, end = g.getVertices().second;
for(; it != end; ++it)
;
// fine
std::pair<Iter, Iter> p = g.getVertices();
BOOST_FOREACH(unsigned handle, p)
;
// fine
unsigned vertex_count = 0;
BOOST_FOREACH(unsigned handle, g.getVertices())
vertex_count++;
// oops, infinite loop
vertex_count = 0;
BOOST_FOREACH(unsigned handle, g.getVertices())
vertex_count++;
vertex_count = 0;
BOOST_FOREACH(unsigned handle, g.getVertices())
vertex_count++;
// ... last block repeated 6 times
Run Code Online (Sandbox Code Playgroud)
迭代器代码:
class Iterator
: …Run Code Online (Sandbox Code Playgroud) 我想就BOOST_FOREACH的使用提出建议.
我已经读过它并不是真的建议在性能方面是一个非常重的标题.
此外,它强制使用"break"和"continue"语句,因为你不能真正拥有由布尔驱动的退出条件,并且我总是被告知应该尽可能避免"break"和"continue".
当然,优点是您不直接处理迭代器,这样可以简化迭代容器的任务.
你怎么看待这件事 ?您是否认为如果使用它应该系统地采用以保证项目的同质性或仅在某些情况下建议使用它?
我正在构建一个从themoviedb.com获取电影信息的应用程序.该信息在JSON文件中提供.我正在尝试使用boost属性树存储信息.但有一点问题.
我通过以下代码说明了这个问题:
#include <vector>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/foreach.hpp>
using namespace std;
using boost::property_tree::ptree;
class single_t{
int sID;
string sName;
public:
void setID(int ID){sID=ID;}
int getID(){return sID;}
void setName(string Name){sName=Name;}
string getName(){return sName;}
};
typedef vector<single_t*> multiple_t;
class foo{
string fTitle;
multiple_t fItems;
public:
string getTitle(){return fTitle;}
void setTitle(string Title){fTitle=Title;}
multiple_t getItems(){return fItems;}
void setItems(multiple_t Items){fItems = Items;}
void setItems(single_t Item){fItems.push_back(&Item);}
};
int main () {
try{
string response = "{\"title\":\"Foo\",\"items\":[{\"id\":123,\"name\":\"test1\"},{\"id\":456,\"name\":\"test2\"}]}";
ptree pt;
stringstream ss; ss << response;
read_json(ss, …Run Code Online (Sandbox Code Playgroud) 我有这个容器:
class /*final*/ Row
{
public:
typedef FieldIterator const_iterator;
typedef FieldIterator iterator;
FieldIterator begin() const;
FieldIterator end() const;
FieldIterator begin();
FieldIterator end();
...
};
Run Code Online (Sandbox Code Playgroud)
鉴于此,以下代码编译得很好:
BOOST_FOREACH(Field field, row)
{
}
Run Code Online (Sandbox Code Playgroud)
但是,Row该类不应该具有可变迭代器,因此我通过删除可变访问来更改Row类:
class /*final*/ Row
{
public:
typedef FieldIterator const_iterator;
FieldIterator begin() const;
FieldIterator end() const;
...
};
Run Code Online (Sandbox Code Playgroud)
但是现在相同的foreach循环无法编译:
1>o:\c\boost_1_48_0\boost\foreach.hpp(364): error C2039: 'type' : is not a member of 'boost::mpl::eval_if<C,F1,F2>'
1> with
1> [
1> C=boost::mpl::false_,
1> F1=boost::range_const_iterator<sqlserver::Row>,
1> F2=boost::range_mutable_iterator<sqlserver::Row>
1> ]
1> c:\dev\internal\playmssqlce\playmssqlce.cpp(29) : see reference to class …Run Code Online (Sandbox Code Playgroud) 我正在做类似这个项目正确的BOOST_FOREACH用法吗?
但是,我返回的列表包含在boost :: shared_ptr中.如果我没有在BOOST_FOREACH循环之前将列表分配给变量,那么我会在运行时遇到崩溃,因为列表正在被破坏,因为它是临时的.
boost::shared_ptr< list<int> > GetList()
{
boost::shared_ptr< list<int> > myList( new list<int>() );
myList->push_back( 3 );
myList->push_back( 4 );
return myList;
}
Run Code Online (Sandbox Code Playgroud)
然后......
// Works if I comment out the next line and iterate over myList instead
// boost::shared_ptr< list<int> > myList = GetList();
BOOST_FOREACH( int i, *GetList() ) // Otherwise crashes here
{
cout << i << endl;
}
Run Code Online (Sandbox Code Playgroud)
我希望能够使用上面的内容而不必引入变量'myList'.这可能吗?
如果BOOST_FOREACH迭代的容器在BOOST_FOREACH范围内发生了变化,会发生什么?
BOOST_FOREACH"冻结"初始状态吗?
boost ×10
boost-foreach ×10
c++ ×10
c++11 ×1
for-loop ×1
iterator ×1
json ×1
shared-ptr ×1
subtree ×1
temporaries ×1
visual-c++ ×1