数组容器(STL.Vector & API.ArrayList)

3 篇文章 0 订阅

问题缘由

LeetCode:杨辉三角:

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
首先附上题解

 class Solution {                                                          C++环境
public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>> a(numRows); 
        if(numRows == 0)
          return a;
        for(int i = 0; i < numRows; i++)
            for(int j = 0; i >= j; j++){
                if(i == j || j == 0)
                    a[i].push_back(1);
                else 
                    a[i].push_back(a[i-1][j-1] + a[i-1][j]); 
            }
        return a;
    }
};
class Solution {                                                           Java环境
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> list = new ArrayList();
        for(int i = 0 ; i < numRows ; i++){
            List<Integer> numList = new ArrayList();
            for(int j = 0 ; j <= i ; j++){
                if( j == 0 || j == i){
                    numList.add(1);
                }else{
                    numList.add(list.get(i-1).get(j-1)+list.get(i-1).get(j));
                }
            }
            list.add(numList);
        }
        return list  ;
      }
}

题目定义了一个数组方法,使用vector来创建目标结果,题解过程遇到的问题包含:

  • C++
    • 1.数组越界1 ——遇到a[][]形式的索引,注意位置计算是否越界
    • 2.操作符类型不匹配2 ——
    • 3.空指针3 ——数组未创建
  • Java
    • 1.引用错误4 ——java.arrayslist中arrayslist并不是一个数组类型,对其元素的引用需要使用get()方法

问题处理

  • C++
    直接定义的数组不可以返回指针给使用容器定义的数组。
    容器定义的数组不可以用a[][]形式进行增减元素,需使用自身的函数。
    特殊情况直接排除。(空数组)
  • Java
    元素引用使用包含的方法(需要使用get()方法从ArrayList中获取特定索引处的元素不能使用[]在ArrayList中的特定索引处获取元素。它只能用于数组,而文件不是数组,而是ArrayList。)

容器使用

C++——Vector(允许数组形式的直接下角标访问与“已存在元素”修改,而增减元素调用方法)

vector 容器是包含 T 类型元素的序列容器,和 array<T,N> 容器相似,不同的是 vector 容器的大小可以自动增长,从而可以包含任意数量的元素;因此类型参数 T 不再需要模板参数 N。只要元素个数超出 vector 当前容量,就会自动分配更多的空间。只能在容器尾部高效地删除或添加元素。

  • 声明&创建

    vector < double > values;声明一个valve名的容器
    values.reserve(size);重定义容器容量。容器容量和容器大小的区别
    values.resize(size,N);重定义元素数量。会用默认值填充
    vector< double > values(size);创建一个容量为size的默认值均为0的容器
    vector< double > values {N};创建一个容器含有一个元素N
    vector< double > values(size, N);创建一个容量为size的默认值均为N的容器

  • 常用方法

    size();获取当前数组的大小,对于二维数组需使用例如nums.size(),nums[0].size()分别获取行列大小
    sort(values.begin(),values.end());对当前数组begin到end范围进行排列从小到大
    capacity();
    swap(n,m);交换n和m的值
    front();获取数组第一个元素值
    back()获取;数组最后一个元素
    at(index);索引目标位置,但不会越界
    push_back();向数组尾部添加一个元素
    pop_back();从数组尾部去掉一个元素
    emplace(Po,int,E); 向Po位置插入int个元素E
    insert(Po,E);向Po位置插入一个元素E
    insert(Po,P1,P2);在Po位置插入另一个序列从P1到P2位置的多个变量
    insert(Po,int,E);向Po位置插入int个元素E
    erase(Po,P1);删除某个位置的元素或者某个范围的元素
    remove(Po,P1,E);删除Po到P1范围内的E
    clear();清空数组

Java——ArrayList(访问与任何修改均需调用方法)

可调整大小的数组的实现List接口。 实现所有可选列表操作,并允许所有元素,包括null 。 除了实现List 接口之外,该类还提供了一些方法来操纵内部使用的存储列表的数组的大小。 (这个类是大致相当于Vector,不同之处在于它是不同步的)。

  • 声明&创建

    List< Integer> list = new ArrayList();
    ArrayList[] arrayList = new ArrayList[n];
    ArrayList<String[]> arrayList = new ArrayList();

  • 常用方法

    void Arrays.sort(N,M);交换元素
    boolean add(E e) 将指定的元素追加到此列表的末尾。
    void add(int index, E element) 在此列表中的指定位置插入指定的元素。
    boolean addAll(Collection<? extends E> c) 按指定集合的Iterator返回的顺序将指定集合中的所有元素追加到此列表的末尾。
    boolean addAll(int index, Collection<? extends E> c) 将指定集合中的所有元素插入到此列表中,从指定的位置开始。
    void clear() 从列表中删除所有元素。
    Object clone() 返回此 ArrayList实例的浅拷贝。
    boolean contains(Object o) 如果此列表包含指定的元素,则返回 true 。
    E get(int index) 返回此列表中指定位置的元素。
    int indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。
    boolean isEmpty() 如果此列表不包含元素,则返回 true 。
    Iterator iterator() 以正确的顺序返回该列表中的元素的迭代器。
    int lastIndexOf(Object o) 返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。
    E remove(int index) 删除该列表中指定位置的元素。
    boolean remove(Object o) 从列表中删除指定元素的第一个出现(如果存在)。
    boolean removeAll(Collection<?> c) 从此列表中删除指定集合中包含的所有元素。
    boolean removeIf(Predicate<? super E> filter) 删除满足给定谓词的此集合的所有元素。
    protected void removeRange(int fromIndex, int toIndex) 从这个列表中删除所有索引在 fromIndex (含)和 toIndex之间的元素。
    boolean retainAll(Collection<?> c) 仅保留此列表中包含在指定集合中的元素。
    E set(int index, E element) 用指定的元素替换此列表中指定位置的元素。
    int size() 返回此列表中的元素数。
    void sort(Comparator<? super E> c) 使用提供的 Comparator对此列表进行排序以比较元素。
    Object[] toArray() 以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的数组。
    T[] toArray(T[] a) 以正确的顺序返回一个包含此列表中所有元素的数组(从第一个到最后一个元素); 返回的数组的运行时类型是指定数组的运行时类型。


  1. if(i > 1 && j > 1) a[i].push_back(a[i-1][j-1] + a[i-1][j]);
    执行状态:执行出错
    我的输入:5
    我的答案:AddressSanitizer: heap-buffer-overflow on address 0x602000000098 at pc 0x000000405b25 bp 0x7ffdcd2e9190 sp 0x7ffdcd2e9188

    ↩︎
  2. (找不到为啥了)
    执行状态:执行出错
    我的输入:5
    我的答案:error: no match for ‘operator+=’ (operand types are ‘std::_Vector<Vectorr’ and ‘int’)

    ↩︎
  3. vector<vector> a(numRows)
    if(numRows == 0)
    return a;
    for(int i = 0; i < numRows; i++)
    for(int j = 0; i >= j; j++){
    if(i == j || j == 0)
    a[i].push_back(1)
    else
    a[i].push_back(a[i-1][j-1] + a[i-1][j]);
    }
    return a;
    执行状态:执行出错
    我的输入:5
    我的答案:Line 922: Char 34: runtime error: reference binding to null pointer of type ‘value_type’ (stl_vector.h)

    ↩︎
  4. numList.add(list.get(i-1).get(j-1)+list.get(i-1).get(j));
    执行状态:执行出错
    我的答案:error: array required, but ArrayList< > found

    ↩︎
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值