C++,std :: copy和templates

Joh*_*nas 2 c++ templates copy vector

我正在使用模板和STL进行实验.这是我的测试代码......

template <typename Item>
struct TList
{
    typedef std::vector <Item> Type;
};

template <typename Item>
class Cont
{
private:
    typename TList <Item>::Type elements;

public:
    void push_back ( const Item & p ) {elements.push_back ( p );}

    typename TList <Item>::Type ::iterator
        copy (typename TList <Item>::Type ::iterator first,
                typename TList <Item>::Type ::iterator last,
                typename TList <Item>::Type ::iterator result) 
        {
            elements.resize(elements.size() + last - first);  //Exception
            return copy ( first, last, result ); 
        }

        typename TList <Item>::Type ::iterator begin() { return elements.begin(); }
};
Run Code Online (Sandbox Code Playgroud)

但在复制操作期间

int main()
{
    Cont <double> cont;
    cont.push_back(1);
    cont.push_back(2);

    TList <double>::Type v;
    v.push_back(3);
    v.push_back(4);
    cont.copy(v.begin(), v.end(), cont.begin());  //Exception
    cont.copy(v.begin(), v.end(), cont.end());  //Exception

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该程序导致运行时异常.你能帮我找到错误吗?

Exception: Vector iterator + offset out of range...
Run Code Online (Sandbox Code Playgroud)

Oli*_*rth 7

表达方式:

elements.size() + last - first
Run Code Online (Sandbox Code Playgroud)

被评估为:

(elements.size() + last) - first
Run Code Online (Sandbox Code Playgroud)

第一次添加的结果将是一个超出向量边界的迭代器,它会触发异常(在调试模式下).你可以试试这个:

elements.size() + (last - first)
Run Code Online (Sandbox Code Playgroud)

或者更像STL的方法:

elements.size() + std::distance(first, last)
Run Code Online (Sandbox Code Playgroud)