方案:如何从向量中删除/删除元素

时间:2012-11-27 10:03:48

标签: vector scheme gimp script-fu

我正在为Gimp script-fu启动方案,我找不到从向量中删除项目的简单方法。

我唯一的解决方案是:

  1. 将矢量转换为列表
  2. 从列表中删除项目(http://stackoverflow.com/questions/1905222/how-to-delete-an-element-from-a-list-in-scheme)
  3. 将列表转换为矢量
  4. 这是一种更简单的方式吗?

    这是我的代码:

    (set! myvector (list->vector (delete item (vector->list myvector))))
    
    (define delete
      (lambda (item list)
        (cond
         ((equal? item (car list)) (cdr list))
         (else (cons (car list) (delete item (cdr list)))))))
    

2 个答案:

答案 0 :(得分:3)

就是这样:你需要创建一个没有需要删除的元素的新向量,复制所有其他元素。但是在你的代码中,你错过了向量中存在元素而不是的情况,你也不需要创建一个中间列表,直接从向量到向量。我用Racket使用标准Scheme编写了这个,它应该很容易适应script-fu:

(define (vector-delete vec elt)
  (let ((new-vec (if (> (vector-length vec) 0)
                     (make-vector (- (vector-length vec) 1))
                     (vector))))
    (define (loop i j)
      (cond ((= i (vector-length vec))
             new-vec)
            ((equal? (vector-ref vec i) elt)
             (loop (+ i 1) j))
            ((< j (vector-length new-vec))
             (vector-set! new-vec j (vector-ref vec i))
             (loop (+ i 1) (+ j 1)))
            (else vec)))
    (loop 0 0)))

像这样使用:

(define myvector #(1 2 3))
(set! myvector (vector-delete myvector 3))
myvector
=> '#(1 2)

答案 1 :(得分:0)

或者通过更直观的方式:

(define (vector-delete v i)
  (vector-append (vector-take v i) (vector-drop v (+ i 1)))) 
相关问题