针对 resize() + 迭代器循环 push_back [英] Looped push_back against resize() + iterator

查看:31
本文介绍了针对 resize() + 迭代器循环 push_back的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

简单的问题;什么更好,为什么?

<预><代码>out.resize( in.size() );T1::iterator outit = out.begin();for( inIt = in.begin() 结束, ++inIt, ++outIt )*outit = *inIt或者out.erase();for( inIt = in.begin() 结束,++inIt )out.push_back( inIt );

我假设 push_back 中隐含的内存分配值得避免但要确保.

谢谢

感谢您提出的 = 在建议中的人;).我正在使用的实际代码是:

<预><代码>模板//不能阻止浏览器忽略尖括号中的类T1,类T2bool asciihex( T1& out, const T2& in ){//out.erase();out.resize( in.size()/2 );if( std::distance( in.begin(), in.end() ) % 2 )//使用距离而不是大小来最小化对T2的要求?返回假;for( T2::const_iterator it = in.begin(); it != in.end(); it += 2 ){out.push_back(((((*it > '9' ? *it - 0x07 : *it) - 0x30) '9' ? *(it+1) - 0x07 : *(it+1)) - 0x30) &0x000f));}返回真;}模板bool asciihex( T1& out, const T2& in ){size_t size = in.size();if( size % 2 )//使用距离而不是大小来最小化对T2的要求?返回假;out.resize( 大小/2 );T1::iterator outit = out.begin();for( T2::const_iterator it = in.begin(); it != in.end(); it += 2, ++outit ){*outit = ((((*it > '9' ? *it - 0x07 : *it) - 0x30) '9' ? *(it+1) - 0x07 : *(it+1)) - 0x30) & 0x000f);}返回真;}

我已将 push_back 标记为答案,因为它似乎是共识,因此对遇到相同问题的其他人更有用.但是,我最终使用了迭代器方法,因为我感兴趣的容器类之一不支持 push_back... 里程数各不相同.

解决方案

第二个,如果您担心多个扩展,请使用 out.reserve().添加到向量的正确答案几乎总是 push_back 或 back_inserter,这可以避免一些可能的问题(例如,异常保证、构造函数、写到末尾),而您在使用其他方法时必须注意这些问题.

Simple question; what's better and why?



    out.resize( in.size() );
    T1::iterator outit = out.begin();
    for( inIt = in.begin() to end, ++inIt, ++outIt )
       *outit = *inIt
OR

    out.erase();
    for( inIt = in.begin() to end, ++inIt )
        out.push_back( inIt );


I'm assuming the memory assignment implicit in push_back is worth avoiding but want to make sure.

Thanks

EDIT: Thanks for the out = in suggestions guys ;). The actual code I'm playing with is:


template//can't stop the browser ignoring th class T1, class T2 in angle brackets
bool asciihex( T1& out, const T2& in )
{
    //out.erase();
    out.resize( in.size() / 2 );
    if( std::distance( in.begin(), in.end() ) % 2 )//use distance rather than size to minimise the requirements on T2?
        return false;
    for( T2::const_iterator it = in.begin(); it != in.end(); it += 2 )
    {
        out.push_back(((( (*it > '9' ? *it - 0x07 : *it)  - 0x30)  '9' ? *(it+1) - 0x07 : *(it+1)) - 0x30) & 0x000f));
    }
    return true;
}

template
bool asciihex( T1& out, const T2& in )
{
    size_t size = in.size();
    if( size % 2 )//use distance rather than size to minimise the requirements on T2?
        return false;
    out.resize( size / 2 );
    T1::iterator outit = out.begin();
    for( T2::const_iterator it = in.begin(); it != in.end(); it += 2, ++outit )
    {
        *outit = ((( (*it > '9' ? *it - 0x07 : *it)  - 0x30)  '9' ? *(it+1) - 0x07 : *(it+1)) - 0x30) & 0x000f);
    }
    return true;
}

Edit: I've marked push_back as the answer as it seems to be the consensus and, therefore, more useful to anyone else with the same problem. However I have ended up using the iterator method as one of the container classes I'm interested in doesn't support push_back... mileage varies.

解决方案

The second, and if you're concerned about multiple extensions use out.reserve(). The right answer to adding to a vector is almost always push_back or back_inserter, which avoid some possible problems (exception guarantees, constructors, writing past the end, for example) that you'd have to pay attention to with other methods.

这篇关于针对 resize() + 迭代器循环 push_back的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆