5.2 vector: 创建和使用vector的各种变体

Clojure练习-5.组合数据类型

“用100个函数来操作一个数据结构比10个函数操作10个数据结构要好很多。基于一个统一的数据结构,我们可以构建出一系列的小函数,这些小函数又可以组合起来形成一个强大的系统。而为不同的数据结构编写不同的函数,在根本上就削减了复用的可能。” —— [ Alan Perlis ]

  • Clojure练习-5组合数据类型

    • 组合数据类型

      • 2 vector 创建和使用vector的各种变体

        • 已知
        • 解1
        • 测试
        • 解2
        • 测试

5. 组合数据类型

5.2 vector: 创建和使用vector的各种变体

实现一个函数:已知 一个二维方阵,

输入: 某点位置

返回: 某点的所有邻接位置(不包括对角线方向)。

已知

(def matrix
  "二维方阵"
  [[1 2 3] [4 5 6] [7 8 9]])
(doc matrix)

; 取值
(get-in matrix [1 2]) ;=> 6

; 取值-遍历取值
(map #(get-in matrix %)  ‘([1 2])) ;=> (6)
(map #(get-in matrix %)  ‘([1 0] [0 1])) ;=>  (4 2)

; x,y分别相加
(map +  [0 0] [-1 0]) ;=> (-1 0)
; x,y分别相加 - 遍历
(def Δ [[-1 0] [1 0] [0 -1] [0 1]])
(map #(map +  [0 0] %)  Δ) ;=> ((-1 0) (1 0) (0 -1) (0 1))

; 使用filter
(doc filter)

(filter #(< % 3) (range 10)) ;=> (0 1 2)

解1

;;版本1
(defn neighbors
   "在二维方阵中查找某点邻接位置
  输入:
   size 表示 二位方阵的边长
   xy   表示 某点
   Δ    表示 相对于xy的距离
  返回: 如 ((1 0) (0 1))
  "
  ([size xy] (neighbors [[-1 0] [1 0] [0 -1] [0 1]] size xy))
  ([Δ size xy]
   (filter (fn [an-xy] (every? #(< -1 % size) an-xy)) ;filter的实参1
           ‘((-1 0) (1 0) (0 -1) (0 1)) ;filter的实参2
    )
   )
  )

测试

;;测试
(neighbors 3 [0 0]);=> ((1 0) (0 1))

解2

;;版本2
(defn neighbors
  "在二维方阵中查找某点邻接位置
  输入:
   size 表示 二位方阵的边长
   xy   表示 某点
   Δ    表示 相对于xy的距离
  返回: 如 ((1 0) (0 1))
  "
  ([size xy] (neighbors [[-1 0] [1 0] [0 -1] [0 1]] size xy))
  ([Δ size xy]
   (filter (fn [an-xy] (every? #(< -1 % size) an-xy)) ;filter的实参1
           (map #(map +  [0 0] %) Δ) ;filter的实参2
    )
   )
  )

测试

;;测试
(neighbors 3 [0 0]);=> ((1 0) (0 1))
(map #(get-in matrix %) (neighbors 3 [0 0])); => (4 2)
时间: 2024-10-13 05:59:32

5.2 vector: 创建和使用vector的各种变体的相关文章

动态创建二维vector数组+指针与引用的区别

二维vectorvector<vector <int> > ivec(m ,vector<int>(n));    //m*n的二维vector 动态创建m*n的二维vector方法一:vector<vector <int> > ivec;ivec.resize(m);for(int i=0;i<m;i++) ivec[i].resize(n); 方法二:vector<vector <int> > ivec;ivec

vector创建2维数组

以前我要建立一个二维数组,总是使用 int N=5, M=6; vector<vector<int> > Matrix(N); for(int i =0; i< Matrix.size(); i++){    Matrix[i].resize(M); } 上面多写了三行,就是为了指定 Matrix 的烈数. 今天才发现,可以用更简单的方法完成上面的工作 下面的一行就可以代替上面的四行 vector<vector<int> > Matrix(N, vec

实战c++中的vector系列--再谈vector的insert()方法(都是make_move_iterator惹的祸)

之前说过了关于vector的insert()方法,把vector B的元素插入到vector A中,vector A中的结果我们可想而知,但是vector B中的元素还会如何? 看看之前写过的程序: #include <iostream> #include <vector> int main () { std::vector<int> myvector (3,100); std::vector<int>::iterator it; it = myvector

用vector实现矩阵, vector传参必须用模板泛型

#pragma once #include "stdafx.h" //用vector实现矩阵, vector传参必须用模板泛型 template <typename Object> class Matrix { private: //2维的矩阵,2维的vector数组,vector就是一种动态数组 vector<vector<Object>> array; public: //constructor(), 填充数组(行数) Matrix(int ro

实战c++中的vector系列--vector&lt;unique_ptr&lt;&gt;&gt;赋值给vector&lt;unique_ptr&lt;&gt;&gt;

之前博客讲到 vector可以使用insert方法,将一个vector copy到另一个vector的后面. 之前的博客也讲到过,如果vector容器内部放的是unique_ptr是需要进行所有权转移的. 现在就来八一八如何vector<unique_ptr<>> insert to vector<unique_ptr<>> 如果常规的vector,我们就可以这么使用insert: // inserting into a vector #include &l

【C++】判断元素是否在vector中,对vector去重,两个vector求交集、并集

#include <iostream> #include <vector> #include <algorithm> //sort函数.交并补函数 #include <iterator> //求交并补使用到的迭代器 using namespace std; //打印容器vector void print_vector(vector<int> v){ if(v.size()>0){ cout<<"{"; for

Win32DiskManager创建Linux启动盘U盘变小

今天使用Win32 Disk Manager创建Ubuntu server 12.04启动盘,写完后U盘变为2.1MB. 解决:打开运行-〉diskpart,进入后输入list disk,列出磁盘列表 图中我的U盘已还原至1997MB,原本是2.1MB,输入 select disk 盘号,也就是 select disk 1 输入clean,初始化U盘. 关闭diskpart,右键我的电脑-〉管理-〉存储管理-〉磁盘管理,找到U盘盘符 右键,新建分区,按照提示一步一步来就还原了..

vector容器用法详解

vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组.像数组一样,vector类也用从0开始的下标表示元素的位置:但和数组不同的是,当vector对象创建后,数组的元素个数会随着vector对象元素个数的增大和缩小而自动变化. vector类常用的函数如下所示: 1.构造函数 vector():创建一个空vector vector(int nSize):创建一个vector,元素个数为nSize vector(int nSize,const t& t):创建一个vector,元

STL vector用法介绍

介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通过阅读这篇文章读者应该能够有效地使用vector容器,而且应该不会再去使用C类型的动态数组了.   Vector总览 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象