我来自一个功能相当的编程背景,我不习惯(高效)C++数据结构.我需要一个数据结构来保存多个元素,如图所示struct element.在集合中,字段id应该是唯一的.
我想执行像在集合论比较集时即例如非常快的设置比较{x1,x2,x3}和{x4,x5}欲确定交集{x5}(或{x2}它们在这种情况下相等)和套.减去从其它组如例如{x1,x2,x3} \ {x5} = {x1,x3}.
在C++世界中是否存在......"集合理论"数据结构?
struct element {
int id;
float value;
};
struct element x1 = {1, 1.0};
struct element x2 = {2, 2.0};
struct element x3 = {3, 3.0};
struct element x4 = {3, 3.1};
struct element x5 = {2, 2.0};
我有2个数组让我们说:
A = [1,2,3,4,5] and B = [1,2,3,6,7]
我想执行以下'设置计算':
C = (A ? B)
D = A - (A ? B)
E = B - (A ? B)
实质上:
C = [1,2,3]
D = [4,5]
E = [6,7]
有没有一种聪明的方法来做到这一点,或者我将不得不用循环和ifs交叉检查每个数组成员?我不能使用外部库(如math.js或w/e).
提前致谢.
我最近在朴素集合论中了解了罗素悖论,在考虑所有不属于其自身的集合的集合时,该集合似乎是其自身的成员,当且仅当它不是其自身的成员,这就产生了悖论。我想知道一个询问集合是否是其自身成员的函数是否可以用 Ocaml 这样的函数式语言来实现,因为罗素悖论本身没有明确的答案,如果是这样,希望有任何关于如何解决这个问题的提示问题。此外,我有兴趣了解这些数学悖论是否可以普遍实现。
这是我遇到的很多东西。在Swift中有一种单行的好方法吗?
我可以为此编写一个扩展,但是我感觉好像有一种“显而易见的”高阶函数/集合理论技术正在被我所忽略。
if array.contains(element) {
    array.removeObject(object: element)
}
else {
    array.append(element)
}
我认为解决方案本身并不一定会更好,这只是我每次必须编写此文件时都会考虑的事情。
是否有任何内置的 python 库可用于生成简化的集合表达式?
\n例如,假设我们有一个集合表达式(A\xe2\x88\xa9B)U(A\xe2\x88\xa9C)。这可以简化为A\xe2\x88\xa9(BUC)。
同样(A\xe2\x88\xa9B)U(A\xe2\x88\xa9!B)可以简化为A。
我正在寻找在 python 中实现这个逻辑。我发现它sympy可以用来简化代数表达式,x**2 + 2*x + 1但我不确定它是否可以处理集合表达式。
我尝试从一组中释放元素,这些元素存在于Clojure中的不同序列中.但clojure.set/difference似乎没有像我期望的那样起作用.我的错误在哪里?
一些例子:
(difference #{3 2} '())
结果:( #{3 2}如预期的那样)
(difference #{3 2} '(3))
结果:( #{2}如预期的那样)
(difference #{3 2} '(1))
结果:( #{3 2}如预期的那样)
(difference #{3 2} '(2 3))
结果:( #{}如预期的那样)
(difference #{3 2} '(1 2 3))
而不是结果我得到IllegalArgumentException包含?类型不支持:clojure.lang.PersistentList clojure.lang.RT.contains(RT.java:814)
预期结果: #{}
所以看起来,clojure.set/difference当结果是空集并且要删除的元素集具有比原始集更高的基数时,函数失败.但问题是:为什么这不起作用?我希望这是一个合法的应用程序clojure.set/difference.
自然数n的形式定义(在集合论中)如下:
我认为这会使一些C++代码更简单,如果我被允许这样做:
for (int n : 10)
    cout << n << endl;
它打印的数字从0到9.
所以我尝试执行以下操作,但不编译:
#include <iostream>
#include <boost/iterator/counting_iterator.hpp>
    boost::counting_iterator<int> begin(int t)
    {
        return boost::counting_iterator<int>(0);
    }
    boost::counting_iterator<int> end(int t)
    {
        return boost::counting_iterator<int>(t);
    }
int main() 
{
    for (int t : 10)
        std::cout << t << std::endl;
    return 0;
}
有关如何实现这一目标的任何建议?我用clang ++得到以下错误:
main.cpp:22:20: error: invalid range expression of type 'int'; no viable 'begin' function available
        for (int t : 10)
                ^ ~~
但我想我应该被允许这样做!:)
编辑:我知道如果我在for循环中添加"range"(或其他一些单词)这个词,我可以"伪造"它,但我想知道是否可以不使用它.
康托尔的可数无限和无数无限无限的集合
您可能知道并且您可能已经证明0到1之间的实数集是无穷无尽的.意味着我们无法映射不同自然数上的每个数字.
我得到了一种技术,通过该技术,我可以在不同的自然数上映射0到1之间的所有实数.技术很简单用1替换小数点并在该数字上映射原始数据使得10003上的地图0.0003和103上的0.03
通过使用这种技术,我们将能够在自然数上映射0到1之间的所有实数.所有这些自然数将从1开始,所以我们将有其他数字,其中没有数字将被映射为2或211或79所以这意味着一组自然数是格雷特然后实数在0和1之间.因此0到1之间的实数集是可数无限的.
什么是Ur意见?