C++、std::copy 和模板

Posted

技术标签:

【中文标题】C++、std::copy 和模板【英文标题】:C++, std::copy and templates 【发布时间】:2011-05-23 19:41:12 【问题描述】:

我正在使用模板和 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(); 
;

但是在复制操作期间

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;

程序导致运行时异常。你能帮我找出错误吗?

Exception: Vector iterator + offset out of range...

【问题讨论】:

-1:您是否尝试过在调试器中单步执行您的代码?或者添加跟踪语句来确定关键变量的值? 这是非常危险的代码。它有什么用? @Space: 只在我学习c++的时候考... @GMan:我几乎总是对遵循“这是我的代码。它不起作用。为什么不?”模式的问题投反对票。没有明显的调试尝试。 @Oli,我在发送之前调试了代码,但是我想不出带括号的技巧...... 【参考方案1】:

表达式:

elements.size() + last - first

被评估为:

(elements.size() + last) - first

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

elements.size() + (last - first)

或者更类似于 STL 的方法:

elements.size() + std::distance(first, last)

【讨论】:

谢谢,但是还有一个问题:return copy(first,last,result)导致栈溢出。为什么? @Johnas:那行调用 your copy 方法,所以你最终得到了一个无限递归。您需要明确说明您想要的功能,即return std::copy(first, last, result) 再次感谢,您的建议对我很有帮助。【参考方案2】:

问题是由于您的copy 方法调整了向量的大小,从而使您传递给它的迭代器无效。

【讨论】:

我认为这不是问题所在。如果要相信 OP 的代码 sn-p,则异常发生在执行 resize 的行上。 @Oli:我也刚刚意识到这一点。不过我会留下答案,因为如果新范围大于旧范围,就会发生这种情况。

以上是关于C++、std::copy 和模板的主要内容,如果未能解决你的问题,请参考以下文章

在结构数组上使用 c++ std::copy

使用 declype 推断模板元素类型中的数据类型是不是正确?

如何将 unique_ptr 与 std::copy 一起使用?

C 中的 std::copy 等价物

C++入门C++ 函数模板&类模板

C++模板类和类模板