我正在使用 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) 我正在使用 boost 图形库。我需要序列化一个 \ngraph 对象并稍后将其读出。但我发现我的\n程序无法与 XML 归档器一起正常工作。它总是抛出异常:
\n\n\n\n\nXML 开始/结束标记\n 不匹配 - 位置。
\n
我没有"position"在序列化代码中定义名为 \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) 我正在尝试制作一个小程序来使用 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) 我有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)这样你就不会读取你已经读过的值.
使用这两种算法有什么区别.我一直想知道我应该如何优化它们.他们如何区分内存和速度?这个比那个好吗?除了代码清晰度,我的意思是.
这是我的第一个版本:
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) 我正在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 ++规则中.
我有以下层次结构:
我有以下层次结构:
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) 这是代码段.如果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) 我想创建一个10×10的数组,其中包含'.'每个元素.所以我写道:
int A[10][10]={ '.','.','.','.',
Run Code Online (Sandbox Code Playgroud)
(等一下我要写100个句号和100个逗号)
'.','.','.'}
Run Code Online (Sandbox Code Playgroud)
另一种方法是写'.',10次,然后复制粘贴10次,但这仍然需要时间,我不认为这是最聪明的方法.
有更聪明的方法吗?我不想写那么久的句号.
我在读某人的密码.这是来自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_map而distance_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++ ×9
boost ×5
boost-graph ×2
algorithm ×1
c ×1
constructor ×1
for-loop ×1
graph ×1
if-statement ×1
inheritance ×1
interface ×1
loops ×1
parsing ×1
performance ×1
reference ×1