如何在仅允许array.add(int)

时间:2015-07-18 16:31:22

标签: arrays optimization abstraction

我正在尝试在一种外来编程语言中实现一种算法,该语法要求我从一维数组中删除一个元素,但该语言没有一种方法可以在索引i处删除元素x。

这些方法可用于数组。[方法]():

  • add(x)--- push x并调整长度+ 1
  • resize(x)--- new length = x
  • count()---返回数组的长度

有没有办法可以编写自己的数组方法或删除方法,使用原始数据类型,基本控制流和变量?

我考虑使用一个包含保留和丢弃项目的数组以及一组布尔值来表示 include == true / false。数组将共享相同的索引,但我不确定这是解决此问题的计算效率最高的方法。

2 个答案:

答案 0 :(得分:1)

如果您不需要保留订单:

{"key" : " \"Some text WITH quotes\" "}

如果你这样做,你有几个选择:

  • 做几次以上的事情。
  • 创建一个新数组,其中包含要删除的索引与结束之间的所有内容,然后调整数组大小,然后重新添加所有其他元素。
  • 创建一个包含所需内容的新数组,然后分配旧数组。

但更基本的问题是为什么这种语言没有删除功能。你用这种语言做的任何事情的意图都是在一个没有删除概念的领域吗?

答案 1 :(得分:1)

更新: Staighforward解决方案,不使用其他阵列。运行时和使用的内存量取决于countresize子例程以及索引[]实现细节的访问,这些细节未在文档中描述:

sub
   remove( array< int,1 >& initial_array, int item_to_remove )
begin
   loop
      int i = 1
      int removed_count = 0
      int count = initial_array.count()
   until
      i > count - removed_count;
   begin
      if( initial_array[i] != item_to_remove ) then
         # remove item by replacing it with the item from the tail
         initial_array[i] = initial_array[count - removed_count];
         removed_count = removed_count + 1
         continue;
      end;
      i = i + 1;
   end;
   # cut the tail
   initial_array.resize(count - removed_count);
end;

array<int> foo[] = { 1, 2, 3, 2, 3 };
remove( foo, 3 );  # after execution foo must contain { 1, 2, 2 }

更复杂的解决方案将是实现更适合您的目的数据结构。正如我的暗示,你可以通过实施PCL Extension

来实现这一目标

正如@iAdjunct指出的那样,为什么array首先没有这个方法很有意思。