使用 Swig 将 std::set 转换为 ruby
Convert std::set to ruby with Swig
我正在使用 Swig 在 ruby 中使用 C++,目前我已经完成了一个简单的文件示例 david.h
#include <stdio.h>
class David
{
public:
David(int x)
{
this->x = x;
}
void announce()
{
printf("David %d\n", x);
}
int x;
};
还有一个像这样的 swig 文件
%module "david"
%{
#include <libdavid.h>
%}
class David
{
public:
David(int x);
void announce();
int x;
};
我的 extconf.rb
看起来像这样
require 'mkmf'
system('swig -c++ -ruby libdavid.i') or abort
create_makefile('david')
这有助于我在 ruby 中执行一个非常简单的示例,例如
2.2.1 :001 > a=David::David.new(42)
=> #<David::David:0x000000022c3ec0 @__swigtype__="_p_David">
2.2.1 :002 > a.x
=> 42
现在我已经非常努力地尝试了一段时间,但我就是想不出如何使用示例 here 中给出的 c++ stl 中的集合。
如果有人能帮助我解决如何创建一组 stl 整数或矢量并展示如何插入和擦除方法在该 set/vector 上工作,那将是非常好的。简单的代码示例不仅对我很有用,而且对许多将来可能会遇到这种情况的人也很有用。
这只是个人要求,如果您很忙,请跳过此部分。
老实说,我使用堆栈溢出已经有一段时间了,但慢慢地我开始对社区感到失望。我已经发布了几个问题,但没有收到满意的答案,没有赞成票,没有反对票,什么都没有,我只是没有收到任何答案。令我惊讶的是,可以通过简单的 google 搜索来回答的极其琐碎的问题通常非常受欢迎,而来自新用户的重要问题要么被严重否决,要么被完全忽略。我明白社区不欠我任何东西。但如果有人能解释可能的原因,我将不胜感激。
谢谢
这还不完整,但可以作为有用的参考。我找不到合适的文档,但它工作正常。
将此添加到 swig 文件
%include <std_set.i>
namespace std {
%template(IntSet) set<int>;
}
现在运行 extconf.rb
现在 ruby
支持以下 set 命令
2.2.1 :001 > a=David::IntSet.new
=> std::set<int,std::less< int >,std::allocator< int > > []
2.2.1 :002 > a.push(4)
=> 4
2.2.1 :003 > a.push(1)
=> 1
2.2.1 :004 > a.push(123)
=> 123
2.2.1 :005 > a.push(612)
=> 612
2.2.1 :006 > a
=> std::set<int,std::less< int >,std::allocator< int > > [1,4,123,612]
2.2.1 :007 > a[0]
=> 1
2.2.1 :008 > a.erase(a.begin)
=> nil
2.2.1 :009 > a
=> std::set<int,std::less< int >,std::allocator< int > > [4,123,612]
2.2.1 :010 > a[0]
=> 4
2.2.1 :011 > a[1]
=> 123
2.2.1 :012 > a.erase(a.begin)
=> nil
2.2.1 :013 > a
=> std::set<int,std::less< int >,std::allocator< int > > [123,612]
我仍然不清楚 push 如何像 insert for set 那样工作,但它确实有效。
但是这个例子清楚地展示了如何使用 set。向量可以使用类似的方法。
这个答案当然不完整,欢迎 answers/comments 有经验的用户回答。
我正在使用 Swig 在 ruby 中使用 C++,目前我已经完成了一个简单的文件示例 david.h
#include <stdio.h>
class David
{
public:
David(int x)
{
this->x = x;
}
void announce()
{
printf("David %d\n", x);
}
int x;
};
还有一个像这样的 swig 文件
%module "david"
%{
#include <libdavid.h>
%}
class David
{
public:
David(int x);
void announce();
int x;
};
我的 extconf.rb
看起来像这样
require 'mkmf'
system('swig -c++ -ruby libdavid.i') or abort
create_makefile('david')
这有助于我在 ruby 中执行一个非常简单的示例,例如
2.2.1 :001 > a=David::David.new(42)
=> #<David::David:0x000000022c3ec0 @__swigtype__="_p_David">
2.2.1 :002 > a.x
=> 42
现在我已经非常努力地尝试了一段时间,但我就是想不出如何使用示例 here 中给出的 c++ stl 中的集合。 如果有人能帮助我解决如何创建一组 stl 整数或矢量并展示如何插入和擦除方法在该 set/vector 上工作,那将是非常好的。简单的代码示例不仅对我很有用,而且对许多将来可能会遇到这种情况的人也很有用。
这只是个人要求,如果您很忙,请跳过此部分。
老实说,我使用堆栈溢出已经有一段时间了,但慢慢地我开始对社区感到失望。我已经发布了几个问题,但没有收到满意的答案,没有赞成票,没有反对票,什么都没有,我只是没有收到任何答案。令我惊讶的是,可以通过简单的 google 搜索来回答的极其琐碎的问题通常非常受欢迎,而来自新用户的重要问题要么被严重否决,要么被完全忽略。我明白社区不欠我任何东西。但如果有人能解释可能的原因,我将不胜感激。
谢谢
这还不完整,但可以作为有用的参考。我找不到合适的文档,但它工作正常。 将此添加到 swig 文件
%include <std_set.i>
namespace std {
%template(IntSet) set<int>;
}
现在运行 extconf.rb 现在 ruby
支持以下 set 命令2.2.1 :001 > a=David::IntSet.new
=> std::set<int,std::less< int >,std::allocator< int > > []
2.2.1 :002 > a.push(4)
=> 4
2.2.1 :003 > a.push(1)
=> 1
2.2.1 :004 > a.push(123)
=> 123
2.2.1 :005 > a.push(612)
=> 612
2.2.1 :006 > a
=> std::set<int,std::less< int >,std::allocator< int > > [1,4,123,612]
2.2.1 :007 > a[0]
=> 1
2.2.1 :008 > a.erase(a.begin)
=> nil
2.2.1 :009 > a
=> std::set<int,std::less< int >,std::allocator< int > > [4,123,612]
2.2.1 :010 > a[0]
=> 4
2.2.1 :011 > a[1]
=> 123
2.2.1 :012 > a.erase(a.begin)
=> nil
2.2.1 :013 > a
=> std::set<int,std::less< int >,std::allocator< int > > [123,612]
我仍然不清楚 push 如何像 insert for set 那样工作,但它确实有效。 但是这个例子清楚地展示了如何使用 set。向量可以使用类似的方法。
这个答案当然不完整,欢迎 answers/comments 有经验的用户回答。