zoukankan      html  css  js  c++  java
  • 《条目三十:确保目标区间足够大》

    《条目三十:确保目标区间足够大》

    在使用STL中的算法时,确保目标区间足够,这个应该怎么理解?

    在我看来就是,容器,在初始化时使用reserve()强制设定容器的容量,和在目标容器比源容器size()元素个数更小时,在使用的时候,如果是直接对目标容器操作,会由于目标容器与源容器大小不匹配的问题,从而报错。

    例如:
    int transmogrify(int x);
    vector src;
    for(int i = 0; i < 10; ++i)
    {
    src.push_back(i);
    }

    vector<int> results;
    transform(src.begin(), src.end(), results.end(), transmogrify);//报错
    

    报错。。。因为results.end()是目标容器的最后,后面没有元素了,所以访问出错。

    int transmogrify(int x);
    vector<int> src;
    for(int i = 0; i < 10; ++i)
    {
    	src.push_back(i);
    }
    
    vector<int> results;
    results.reserve(10);
    for(int i = 0; i < 3; ++i)
    {
    	src.push_back(i);
    }
    
    transform(src.begin(), src.end(), results.begin()+results.size()/2, transmogrify);//报错
    

    报错。。。因为reserve()只是把容器的容量强制设置了,而不是容器的大小,容器的大小需要在真正插入、删除元素后才会改变。

    对于第一个例子的正确方法是实用插入型的迭代器。
    int transmogrify(int x);
    vector src;
    for(int i = 0; i < 10; ++i)
    {
    src.push_back(i);
    }

    vector<int> results;
    transform(src.begin(), src.end(), back_inserter(results), transmogrify);
    

    对于第二个例子正确方法是实用插入型的迭代器。
    int transmogrify(int x);
    vector src;
    for(int i = 0; i < 10; ++i)
    {
    src.push_back(i);
    }

    vector<int> results;
    results.reserve(10);
    transform(src.begin(), src.end(), back_inserter(results, results.begin()+results.size()/2), transmogrify);
    

    在使用算法的时候,必须使容器的区间大小足够大。如果是想在没有区间大小,只有容量的容器中使用算法,需要使用插入型迭代器,push_inserter,front_inserter。

    因为即使用了reserve,但只是把容器的容量强行设置了,而没有改变容器的大小,所以在使用算法时会发生没有元素操作结果,运行错误。

  • 相关阅读:
    select详解
    java Map及Map.Entry详解
    Java 基本类型
    java 获取String出现最多次数的字段
    java 居民身份证的校验
    java 删除文件
    Java 导出excel进行换行
    获取文件及其文件路径
    List<Map<String,Object>> 中文排序
    Java ----单个list 删除元素
  • 原文地址:https://www.cnblogs.com/liangjf/p/10634080.html
Copyright © 2011-2022 走看看