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
}