Templates 通行证;对迭代器的非常量引用;函数

Templates 通行证;对迭代器的非常量引用;函数,templates,c++11,vector,iterator,Templates,C++11,Vector,Iterator,我有一个结构 typedef struct MyStruct { double x, y, z; }MyStruct; 我有一个函数 template <class Iterator> bool SomeFunc ( Iterator& anotherVecBegin ) { ... } 这对我来说也是有意义的 但我正在寻找一种方法: 当迭代器被传递到某个函数的引用时,在函数内部使用迭代

我有一个结构

typedef struct MyStruct
{
    double x, y, z;
}MyStruct;
我有一个函数

template <class Iterator>
bool
SomeFunc    ( 
                Iterator&        anotherVecBegin
            )
{
...
}
这对我来说也是有意义的

但我正在寻找一种方法:

  • 当迭代器被传递到某个函数的引用时,在函数内部使用迭代器插入一个元素

  • 我建议我解决了这个问题。我不需要引用迭代器

    相反,我只是使用了
    back\u inserter

    在被调用方方法中,我执行以下操作:

    std::vector<MyStruct> mySt;
    SomeFunc(std::back_inserter(mySt));
    std::cout << "Struct size after insert: " << mySt.size() << std::endl;
    
    std::vector mySt;
    SomeFunc(std::back_inserter(mySt));
    
    std::不能通过值而不是引用获取迭代器。大多数(可能是所有)标准库函数都会这样做。撇开参数传递不谈,请注意,实际上您并不是在将元素插入容器中,而是在覆盖第一个元素(或者更一般地说,是迭代器引用的元素)。当没有第一个元素时(或者更一般地说,当迭代器不可取消引用时)——就像您的示例中的情况一样,当
    mySt
    vector为空时——您的程序会显示未定义的行为。
    我正在寻找一种使用迭代器插入元素的方法。仅使用迭代器无法更改容器的大小,只能更改容器的内容。要插入(或删除)元素,必须对容器本身调用适当的方法。@Igor,你是对的,我必须按值获取迭代器,而使用
    back\u inserter
    。。如果我所做的有什么不对劲,请发表评论。。
    template <class Iterator>
    bool
    SomeFunc    ( 
                    const Iterator&        anotherVecBegin
                )
    {
         MyStruct pt1;
         pt1.x = 10, pt1.y = 20, pt3.z = 30;
        *(anotherVecBegin)++ = pt1;
    }
    
    std::vector<MyStruct> mySt;
    SomeFunc(std::back_inserter(mySt));
    std::cout << "Struct size after insert: " << mySt.size() << std::endl;
    
    template <class BackInsertIterator>
    bool
    SomeFunc    ( 
                    const BackInsertIterator        anotherVecBegin
                )
    {
         MyStruct pt1;
         pt1.x = 10, pt1.y = 20, pt3.z = 30;
        *(anotherVecBegin)++ = pt1;
        // ... remaining code
    }