小编seh*_*ehe的帖子

Boost无向图合并顶点

我正在使用 Boost C++ 库来构建一个邻接表来表示一个无向图。图上的每条边都与各自的权重相关联,我想检查权重是否大于某个阈值,而不是将两个顶点合并在一起。

我如何合并:

  • 对于要合并的顶点,收集进出该顶点的所有边并将这些边指向新顶点
  • 清除合并顶点
  • 移除顶点

我的问题: 我使用一个简单的程序首先构造算法,然后再将其用于目的。在这个程序中,我使用简单的家谱方法来执行上述步骤。当我使用函数remove_vertex(vertex, Graph)删除顶点时, 出现分段错误。

  • 我无法弄清楚一旦顶点被移除,图形是否会自动更新其结构?

我的 C++ 代码如下:

#include <boost/graph/adjacency_list.hpp>
#include <boost/tuple/tuple.hpp>
#include <boost/config.hpp>
#include <iostream>
#include <vector>
#include <string>

using namespace std;

typedef boost::property<boost::vertex_index_t, int> vertex_property;
typedef boost::property<boost::edge_weight_t, float> edge_property;
typedef typename boost::adjacency_list <boost::vecS,
                                    boost::vecS,
                                    boost::undirectedS,
                                    vertex_property,
                                    edge_property> Graph;
void boostSampleGraph() {

enum family {
  Jeanie, Debbie, Rick, John, Amanda, Margaret, Benjamin, N };
const char *name[] = { "Jeanie", "Debbie", "Rick", "John", "Amanda",
                       "Margaret", "Benjamin", "N"
 }; …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm boost graph boost-graph

1
推荐指数
1
解决办法
1465
查看次数

无法反序列化 boost graph 对象

我正在使用 boost 图形库。我需要序列化一个 \ngraph 对象并稍后将其读出。但我发现我的\n程序无法与 XML 归档器一起正常工作。它总是抛出异常:

\n\n
\n

XML 开始/结束标记\n 不匹配 - 位置。

\n
\n\n

我没有"position"在序列化代码中定义名为 \n 的标签。我不知道如何解决它。这是问题的演示。

\n\n

类型.h

\n\n
#ifndef TYPES_H\n#define TYPES_H\n\n#include <boost/graph/graph_traits.hpp>\n#include <boost/graph/adjacency_list.hpp>\n#include <boost/graph/adj_list_serialize.hpp>\n#include <boost/graph/filtered_graph.hpp>\n#include <boost/multi_index_container.hpp>\n#include <boost/multi_index/ordered_index.hpp>\n#include <boost/multi_index/identity.hpp>\n#include <boost/multi_index/member.hpp>\n#include <boost/multi_index/composite_key.hpp>\n#include <boost/serialization/map.hpp>\n#include <boost/serialization/deque.hpp>\n#include <boost/serialization/variant.hpp>\n#include <boost/variant.hpp>\n#include <boost/ref.hpp>\n\nusing namespace boost;\nnamespace bmi = boost::multi_index;\n\nclass QTable; //forward declaration\ntypedef QTable Eligibility;\n\n//\xc3\xa8\xc2\xa7\xe2\x80\x9a\xc3\xa6\xc2\xb5\xe2\x80\xb9\xc3\xa7\xc2\xb1\xc2\xbb\xc3\xa5\xc5\xbe\xe2\x80\xb9\nenum Observation{present,absent,idle};\n\n//1\xc3\xaf\xc2\xbc\xe2\x80\xb0\xc3\xa5\xe2\x80\xba\xc2\xbe\xc3\xa6\xc2\xa8\xc2\xa1\xc3\xa5\xc5\xbe\xe2\x80\xb9\xc3\xa7\xc5\xa1\xe2\x80\x9e\xc3\xa5\xc2\xae\xc5\xa1\xc3\xa4\xc2\xb9\xe2\x80\xb0\nenum vertex_BatteryLevel_t {vertex_BatteryLevel};\nenum vertex_ObservationHistory_t {vertex_ObservationHistory};\nenum edge_QFunction_t {edge_QFunction};\nenum edge_Eligibility_t {edge_Eligibility};\n\nnamespace boost {\n    BOOST_INSTALL_PROPERTY(vertex,BatteryLevel);\n    BOOST_INSTALL_PROPERTY(vertex,ObservationHistory);\n    BOOST_INSTALL_PROPERTY(edge,QFunction);\n    BOOST_INSTALL_PROPERTY(edge,Eligibility);\n}\n\ntypedef property<vertex_BatteryLevel_t,int,\n    property<vertex_ObservationHistory_t,std::deque<Observation>,\n        property<vertex_index_t,int>\n    > \n> vertex_state;\ntypedef property<edge_QFunction_t,QTable,\n    property<edge_Eligibility_t,Eligibility>\n> edge_qfunction;\ntypedef adjacency_list<\n    vecS,setS,directedS, //\xc3\xa7\xc2\xbb\xe2\x80\x9c\xc3\xa7\xe2\x80\x9a\xc2\xb9\xc3\xa7\xe2\x80\x9d\xc2\xa8vecS\xc3\xa5\xe2\x80\xba\xc2\xa0\xc3\xa4\xc2\xb8\xc2\xba\xc3\xa6\xe2\x80\x94\xc2\xa0\xc3\xa9\xc5\x93\xe2\x82\xac\xc3\xa5\xc5\xa0\xc2\xa8\xc3\xa6\xe2\x82\xac\xc3\xa6\xe2\x80\x9d\xc2\xb9\xc3\xa5\xcb\x9c\xc3\xa7\xc2\xbb\xe2\x80\x9c\xc3\xa7\xe2\x80\x9a\xc2\xb9\xc3\xa4\xc2\xb8\xc2\xaa\xc3\xa6\xe2\x80\xa2\xc2\xb0\xc3\xaf\xc2\xbc\xc5\x92\xc3\xa7\xe2\x80\x9d\xc2\xa8setS\xc3\xa8\xc2\xa1\xc2\xa8\xc3\xa7\xc2\xa4\xc2\xba\xc3\xa8\xc2\xbe\xc2\xb9\xc3\xa4\xc2\xb8\xc2\xba\xc3\xa4\xc2\xba\xe2\x80\xa0\xc3\xa5\xc2\xbc\xc2\xba\xc3\xa8\xc2\xb0\xc6\x92\xc3\xa6\xcb\x9c\xc2\xaf\xc3\xa7\xc2\xae\xe2\x82\xac\xc3\xa5\xe2\x80\xa2\xc3\xa5\xe2\x80\xba\xc2\xbe\xc3\xaf\xc2\xbc\xcb\x86\xc3\xa4\xc2\xb8\xc2\xa4\xc3\xa4\xc2\xb8\xc2\xaa\xc3\xa7\xc2\xbb\xe2\x80\x9c\xc3\xa7\xe2\x80\x9a\xc2\xb9\xc3\xa4\xc2\xb9\xe2\x80\xb9\xc3\xa9\xe2\x80\x94\xc2\xb4\xc3\xa4\xc2\xb8\xe2\x82\xac\xc3\xa4\xc2\xb8\xc2\xaa\xc3\xa6\xe2\x80\x93\xc2\xb9\xc3\xa5\xe2\x80\x98\xc3\xa7\xc5\xa1\xe2\x80\x9e\xc3\xa8\xc2\xbe\xc2\xb9\xc3\xa5\xc2\xaa\xc3\xa8\xc6\x92\xc2\xbd\xc3\xa6\xc5\x93\xe2\x80\xb0\xc3\xa4\xc2\xb8\xe2\x82\xac\xc3\xa6\xc2\xa1\xc3\xaf\xc2\xbc\xe2\x80\xb0\n    vertex_state, //\xc3\xa8\xc5\xa0\xe2\x80\x9a\xc3\xa7\xe2\x80\x9a\xc2\xb9\xc3\xa7\xc5\xa1\xe2\x80\x9e\xc3\xa7\xe2\x80\x9d\xc2\xb5\xc3\xa9\xe2\x80\xa1\xc3\xa5\xe2\x80\x99\xc5\x92\xc3\xa8\xc2\xa7\xe2\x80\x9a\xc3\xa6\xc2\xb5\xe2\x80\xb9\xc3\xa5\xc5\xbd\xe2\x80\xa0\xc3\xa5\xc2\xb2\n …
Run Code Online (Sandbox Code Playgroud)

c++ boost

1
推荐指数
1
解决办法
204
查看次数

Boost.Spirit - 如何使用重复解析为结构?

我正在尝试制作一个小程序来使用 Boost.Spirit 从 /proc/stat 解析 cpu 使用信息。它主要是有效的,但是在使用重复时我无法编译我的语法。我错过了什么?

整个代码:

#include <vector>

#include "boost/fusion/include/adapt_struct.hpp"
#define BOOST_SPIRIT_DEBUG
#include "boost/spirit/include/qi.hpp"
#include "boost/iostreams/device/mapped_file.hpp"

namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;

struct Cpu
{
   unsigned int user;
   unsigned int nice;
   unsigned int system;
   unsigned int idle;
   unsigned int iowait;
   unsigned int irq;
   unsigned int softirq;
   unsigned int steal;
   unsigned int guest;
   unsigned int guest_nice;
};

BOOST_FUSION_ADAPT_STRUCT(
   Cpu,
   (unsigned int, user)
   (unsigned int, nice)
   (unsigned int, system)
   (unsigned int, idle)
   (unsigned int, iowait)
   (unsigned int, irq) …
Run Code Online (Sandbox Code Playgroud)

c++ parsing boost boost-spirit-qi

1
推荐指数
1
解决办法
283
查看次数

boost :: circular_buffer如何处理覆盖移位

我有2个进程:一个生产者和"消费者",它仍然将值保留在缓冲区中,它们将被覆盖.

但让消费者跟踪是一个问题.当缓冲区已满并且值被覆盖时,指向索引0的值是刚刚覆盖的值之前的值(即下一个最旧的值),刚刚插入的值是最后一个索引,移动所有值之间.

cb.push_back(0)
cb.push_back(1)
cb.push_back(2)

consumer reads to cb[1], cb[2] should == 2 when next read

cb.push_back(3)

cb[2] now == 1 effectively reading the old value
Run Code Online (Sandbox Code Playgroud)

有趣的是在循环缓冲区迭代器也保持相同的值,即使在缓冲开始被改写,并除非阅读当你达到这样的工作好吗end()迭代器,它会永远等于end()甚至将更多的值之后迭代器,所以那么你必须std::prev(iter, 1)经过你已经完成了消费,然后当你插入更多的值后再次阅读,std::next(iter, 1)这样你就不会读取你已经读过的值.

c++ boost circular-buffer boost-interprocess

1
推荐指数
1
解决办法
716
查看次数

变量与长算法

使用这两种算法有什么区别.我一直想知道我应该如何优化它们.他们如何区分内存和速度?这个比那个好吗?除了代码清晰度,我的意思是.

这是我的第一个版本:

bool Intersects(BoundingSphere boundingSphere)
{
    D3DXVECTOR3 vectorBetween = (centre - boundingSphere.centre);

    // works out the distance between the sphere centre's using pythag
    float distance = sqrt(
                         pow(vectorBetween.x, 2) 
                       + pow(vectorBetween.y, 2) 
                       + pow(vectorBetween.z, 2));

    // if two radius's add to more than the distance between the centres
    return (radius + boundingSphere.radius > distance);
}
Run Code Online (Sandbox Code Playgroud)

这个方法是相同的,但它不包含变量中的任何值,它只使用一个长计算

bool Intersects(BoundingSphere boundingSphere)
{
    return (radius + boundingSphere.radius >
            (sqrt(pow((centre - boundingSphere.centre).x, 2) +
                  pow((centre - boundingSphere.centre).y, 2) +
                  pow((centre - boundingSphere.centre).z, 2))));
}
Run Code Online (Sandbox Code Playgroud)

c++ performance

0
推荐指数
1
解决办法
123
查看次数

在C++中无法访问的继承函数

我正在Visual C++ 2010中编写一个小程序.

这是基类的代码:

class BaseInfo {

private:
    std::map <std::string, std::string> info;
    std::vector<std::string> extra_info_key;
public:
    uint get_id ();
    //Other function is hidden
};

uint BaseInfo::get_id () {
    return (uint)atoi ((info["ID"]).c_str());
}
Run Code Online (Sandbox Code Playgroud)

然后我创建一个派生类,宣布为:

class test:BaseInfo {
public:
    void f();
};

void test::f (test& inf) {
    cout<<inf.get_id()<<endl;
}
Run Code Online (Sandbox Code Playgroud)

但是我收到了一个错误:

函数"BaseInfo :: get_id无法访问.

我很困惑,似乎一切都在c ++规则中.

c++

0
推荐指数
1
解决办法
135
查看次数

c ++构造函数使用不正确的参数类型来构造对象

我有以下层次结构:

我有以下层次结构:

GameStateBaseClass -> IGameStateInterface -> IntroState
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是当我使用GameEngine引用实例化一个IntroState时(我在GameStateBaseClass中定义)我得到以下错误:

错误1错误C2664:'IntroState :: IntroState(const IntroState&)':无法将参数1从'GameEngine'转换为'const Short :: IntroState&'

在GameStateBaseClass中,我定义了一个带有const GameState引用的构造函数,在main.cpp中我传入了一个游戏引擎的实例.为什么它试图将我的GameEngine参数转换为IntroState引用呢?

这是相应的代码:

GameStateBaseClass.hpp

class GameStateBaseClass
{
    public:
        GameStateBaseClass(const GameEngine &instance);
    private:
        GameStateBaseClass(void); // = delete; // c++1x
        GameStateBaseClass(const GameStateBaseClass &instance); // = delete; // c++1x
        GameStateBaseClass operator=(const GameStateBaseClass &instance); // = delete; // c++1x

        // private members
        const GameEngine &game_engine_instance;
}
Run Code Online (Sandbox Code Playgroud)

GameStateBaseClass.cpp

GameStateBaseClass::GameStateBaseClass(const GameEngine &instance) 
    : game_engine_instance(instance) {
}

// IGameStateInterface.hpp 
class IGameStateInterface : GameStateBaseClass
{
     public:
        virtual void Init() = 0;
        virtual void …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance constructor interface reference

0
推荐指数
1
解决办法
605
查看次数

C++中的流控制构造,如何修改?

这是代码段.如果if语句成功,我想回到循环1.如果if语句成功,我需要程序不添加1000.

editA.i 在程序开头== 0.

我想比较两列字符串并获得距离度量.

我尝试过break和continue命令,但是没有一个能按我的意愿工作.

谢谢

for(editA.i; editA.i<6; editA.i++)  // Loop 1
{
    for(editB.j=0; editB.j<6; editB.j++)    // Loop 2
    {
        if(editA.A[editA.i] == editB.B[editB.j])  // if this statment works, 
            // I want to go back to "Loop 1". How???

            sum+= abs(editA.i - editB.j);

        else
            sum+= 1000;
    }

}
Run Code Online (Sandbox Code Playgroud)

c++ loops for-loop if-statement

0
推荐指数
1
解决办法
215
查看次数

如何为数组分配繁琐的重复值?

我想创建一个10×10的数组,其中包含'.'每个元素.所以我写道:

int A[10][10]={ '.','.','.','.',
Run Code Online (Sandbox Code Playgroud)

(等一下我要写100个句号和100个逗号)

               '.','.','.'}
Run Code Online (Sandbox Code Playgroud)

另一种方法是写'.',10次​​,然后复制粘贴10次,但这仍然需要时间,我不认为这是最聪明的方法.

有更聪明的方法吗?我不想写那么久的句号.

c

0
推荐指数
1
解决办法
89
查看次数

为什么BGL函数的参数用点而不是逗号分隔?

我在读某人的密码.这是来自boost图库的函数.这是原始的函数定义.

 void dijkstra_shortest_paths
      (const Graph& g,
       typename graph_traits<Graph>::vertex_descriptor s, 
       PredecessorMap predecessor, DistanceMap distance, WeightMap weight, 
       VertexIndexMap index_map,
       CompareFunction compare, CombineFunction combine, DistInf inf, DistZero zero,
       DijkstraVisitor vis, ColorMap color = default)
Run Code Online (Sandbox Code Playgroud)

这是我从某人那里挑选出的一段代码.它有效,但我只是不明白他为什么在中间使用点predecessor_map weight_mapdistance_map不是逗号?他传入函数的参数是多少?

dijkstra_shortest_paths(graph, source_vertex,
                          predecessor_map(&predecessors[0])
                          .weight_map(get(&Edge::cost, graph))
                          .distance_map(&distances[0]));
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-graph

0
推荐指数
1
解决办法
186
查看次数