使用Swig将std :: set转换为ruby

Ara*_*atK 6 c++ ruby swig stl

我正在使用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;
};
Run Code Online (Sandbox Code Playgroud)

还有另一个像swig这样的文件

%module "david"
%{
#include <libdavid.h>
%}
class David
{
public:
    David(int x);
    void announce();
    int x;
};
Run Code Online (Sandbox Code Playgroud)

extconf.rb看起来像这样

require 'mkmf'
system('swig -c++ -ruby libdavid.i') or abort
create_makefile('david')
Run Code Online (Sandbox Code Playgroud)

这有助于我像这样在ruby中执行一个非常简单的例子

2.2.1 :001 > a=David::David.new(42)
 => #<David::David:0x000000022c3ec0 @__swigtype__="_p_David"> 
2.2.1 :002 > a.x
 => 42 
Run Code Online (Sandbox Code Playgroud)

现在,我已经非常努力了一段时间,但现在我根本想不通如实例给出了如何使用来自C++ STL设置在这里.如果有人可以帮我解决我如何创建一组整数或者矢量并展示如何在该集合/向量上插入和擦除方法,那将是非常好的.简单的代码示例不仅对我而且对于将来可能面临这种情况的许多人来说非常有用.


如果你很忙,这只是个人要求随意跳过这个.
说实话,我已经使用堆栈溢出了很长一段时间,但慢慢地我开始对社区感到失望.我一直在发几个问题,我没有得到满意的答案,没有上升票,没有下来投票,没有,我只是没有收到任何答案.让我感到惊讶的是,在简单的谷歌搜索中可以回答的非常微不足道的问题通常非常受欢迎,新用户的重要问题要么被严重投票,要么被完全忽略.我知道社区不会对我说任何事情.但如果有人可以解释可能的原因,我将非常感激.

谢谢

Ara*_*atK 1

这并不完整,但可以作为有用的参考。我找不到合适的文档,但它工作正常。将其添加到 swig 文件中

%include <std_set.i>
namespace std {
   %template(IntSet) set<int>;
}
Run Code Online (Sandbox Code Playgroud)

现在运行 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] 
Run Code Online (Sandbox Code Playgroud)

我仍然不清楚推送如何像插入设置一样工作,但它确实有效。但这个例子清楚地展示了如何使用 set。类似的方法可用于矢量。

这个答案当然不完整,非常欢迎有经验的用户的回答/评论。