关于size()返回的问题

  • 刚刚看到有关size()的返回值问题,下面是有关的的内容:
  • 希望看了下面的会有所理解
  •  
  • 讲的是定容栈的(这个不了解不重要)size():
  • 数组类型的实现代码:
  • public class FixedCapacityStackOfString
    {
        private String[] a;//stack entries
        private int N;     //size
        public FixedSapacityStackOfString(int cap)
        { a= new String[cap];    }
        public boolean isEmpty () { return  N==0; }
        public int size() { return N; }
        public void push(String item)
        {    a[N++]=item;}
        public String pop()
        { return a[--N];}
    } 

    这个可以比较map等的push,pop操作

  • 解释:它的实例变量为一个用于保存栈中的元素的数组a[ ],和一个用于保存栈中的元素数量的整数N。要删除一个元素,我们将N减1

  • 并返回a[N]。要添加一个元素,我们将a[N]设为新元素并将N加1。这些操作能保证以下性质:

  1. 数组中的元素顺序和它们被插的顺序相同;

  2. 当N为0时栈为空;

  3. 栈的顶部位于a[N-1](如果栈非空)---》这一定程度解释了下面sort(a.begin(),a.end());排序排的是a【0】到a【N-1】的位置

    1. FixedCapacityStackOfString 的测试用例轨迹
       
      StdIn(push)     StdOut(pop) N 0              1                2                   3                  4
                                                       0         
       to                                             1                                            to              
      be                                              2                                           to             be
      or                                              3                                            to              be            or
      not                                            4                                             to              be            or               not   
      to                                              5                                             to              be            or               not               to
  • 以上内容摘自书中部分,知识或可有所欠缺


vec.erase(vec.begin()+2);删除第3个元素//因为begin()指向第一个元素,begin()+1指向第二个元素,以此类推

vec.erase(vec.begin()+i,vec.begin()+j);删除区间[i,j-1];区间从0开始//这里的后一个begin与上面的有点不同

vec.erase(vec.begin()+i,vec.begin()+j)这里的begin指向位置,及begin+x的指向位置(前后的begin有差别)与下面的upper_bound 及lower_bound都点相似

如vec 里存有1 2 3 4 5 6

执行vec.erase(vec.begin()+1,vec.begin()+3)删除的是2 3 这两个数

upper_bound,lower_bound

  • 如有一个dp数组存有1 2 3 3 5 5

  • upper_bound就是,如果dp里面有要找的 数,则返回最这个数字最右边的位置+1

  • 如int a=upper_bound(dp,dp+3,3)-dp 在dp数组里找3,3最又边的位置是dp【4】的位置,所以返回的dp【5】的位置

  • 所以a=5

  • 如果dp里没有这个数字的话,返回的是仅小于要查的数字的数字所在位置+1

  • 如int a=upper_bound(dp,dp+3,4)-dp

  • 这语句是在数组中的dp[0]到dp[3]找4这个数字,因为没找到,这里仅小于4的数字的是在a[3] 位置的3,返回的是dp[3]+1这个位置

  • 而lower_bound返回的

  • 如果数组里有要查的数的话则返回这个数最小的位置

  • 如int a=lower_bound(dp,dp+3,3)-dp 这里的a=3 

  • 如果数组里没有这个数的则返回仅小于这个数的位置+1

  • 如要查4的话  a就等于dp[3]+1-dp=4 也就是dp【4】这个位置

  • 小结:如果数组里没有要找的数,lower_bound,与upper_bound没区别

猜你喜欢

转载自blog.csdn.net/weixin_42373330/article/details/81111618