【问题标题】:Convert std::set to ruby with Swig使用 Swig 将 std::set 转换为 ruby
【发布时间】:2016-05-05 14:07:53
【问题描述】:

我正在使用 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 

现在我已经努力了一段时间,但我根本不知道如何使用 c++ stl 中的 set,如示例 here 中给出的那样。 如果有人可以帮助我创建一组整数或向量的 stl 并展示如何在该集合/向量上工作的插入和擦除方法,那将是非常好的。简单的代码示例不仅对我很有用,而且对许多将来可能面临这种情况的人也很有用。


这只是个人要求,如果您很忙,请随意跳过。
老实说,我已经使用堆栈溢出很长一段时间了,但慢慢地我开始对社区感到失望。我已经发布了一些问题,但没有收到满意的答案,没有赞成票,没有反对票,什么都没有,我只是没有收到任何答案。令我惊讶的是,可以在简单的谷歌搜索中回答的极其微不足道的问题通常非常受欢迎,而来自新用户的重要问题要么被严重否决,要么被完全忽略。我知道社区不欠我任何东西。但如果有人能解释可能的原因,我将非常感激。

谢谢

【问题讨论】:

    标签: c++ ruby stl swig


    【解决方案1】:

    这并不完整,但可以作为有用的参考。我找不到合适的文档,但它工作正常。 将此添加到 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。类似的方法可以用于向量。

    这个答案肯定不完整,非常欢迎有经验的用户提供答案/cmets。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 2020-04-01
    • 1970-01-01
    • 2013-12-03
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多