代码之家  ›  专栏  ›  技术社区  ›  knittl

如果数组都是0(或false),我可以签入C(++)?

  •  5
  • knittl  · 技术社区  · 14 年前

    如果一个数组都是0(或false),我可以签入C(++),而不在每个值上迭代/循环,也不分配相同大小的新数组(使用 memcmp )?

    我在滥用bools数组,在运行时使用任意大的位集,并对其进行位翻转

    8 回复  |  直到 13 年前
        1
  •  4
  •   Oliver Charlesworth    14 年前

    您可以使用以下条件:

    (myvector.end() == std::find(myvector.begin(), myvector.end(), true))
    

    显然,在内部,这个循环覆盖所有值。

    另一种方法(实际上应该避免循环)是重写所有写访问函数,并跟踪 true

    更新

        2
  •  2
  •   EboMike    14 年前

    如果没有分类,不。你打算怎么做?您需要检查每个元素,看看它是否为0!当然,memcmp也会检查每个元素。因为它还可以读取另一个数组,所以成本会高很多。

    您唯一的选择是使用SIMD(从技术上讲,它仍然检查每个元素,但使用的指令更少),但通常不会在泛型数组中这样做。

    (顺便说一下,我的答案假设你有一个简单的静态C/C++数组。如果您可以指定您拥有的数组类型,我们可以更具体一些。)

        3
  •  1
  •   dmckee --- ex-moderator kitten    14 年前

    如果您知道这将是一个需求,那么您可以构建一个由数组(可能是动态的)和计数或当前非零单元格组成的数据结构。显然,单元格的设置必须通过抽象来实现,但这在c++中是很自然的,并且可以在c中使用不透明类型。

        4
  •  1
  •   Dat Chu    14 年前

    假设您有一个N元素数组,您可以对一组基向量进行位检查。

    您可以使用8元素零数组、4元素零数组、2元素零数组和1元素零数组对其进行测试。

    只要知道要测试的数组的最大大小,就只需分配这些元素。此外,测试可以并行进行(如有必要,还可以使用程序集内部函数)。

        5
  •  1
  •   Fred Foo    14 年前

    考虑使用 boost::dynamic_bitset none 成员和其他几个成员 std::bitset -类似于操作,但其长度可以在运行时设置。

        6
  •  0
  •   Å imon Tóth    14 年前

    不,您可以将数组与 memcmp ,但不能将一个值与内存块进行比较。

    你可以做的是使用C++中的算法,但里面仍然包含一个循环。

        7
  •  0
  •   Steve Townsend    14 年前

    您不必遍历整个过程,只需停止循环第一个非零值。

    bool ( __int64 (比如说)但是对齐是一个问题。

    编辑: ++ 等等。

        8
  •  0
  •   Andrew Cottrell    14 年前

    小刀,