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,但只是把容器的容量强行设置了,而没有改变容器的大小,所以在使用算法时会发生没有元素操作结果,运行错误。

  • 相关阅读:
    Linux 共享库
    使用Visual Studio(VS)开发Qt程序代码提示功能的实现(转)
    ZOJ 3469 Food Delivery(区间DP)
    POJ 2955 Brackets (区间DP)
    HDU 3555 Bomb(数位DP)
    HDU 2089 不要62(数位DP)
    UESTC 1307 windy数(数位DP)
    HDU 4352 XHXJ's LIS(数位DP)
    POJ 3252 Round Numbers(数位DP)
    HDU 2476 String painter (区间DP)
  • 原文地址:https://www.cnblogs.com/liangjf/p/10634080.html
Copyright © 2011-2022 走看看