我正在做一些功课,其中包括一个带有很多方法和构造函数的通用类,但我只对以下构造函数感兴趣,我从初始化列表中获取元素并将它们放入我的容器中:
template <typename T, template <typename...> class Container = std::vector>
class Tok{
Container<T> collection;
public:
Tok(std::initializer_list<T> list);
}
我们被告知不能使用算法中的 push_back 函数,只能使用算法中的插入函数插入元素。 首先我实现了这样的构造函数:
template <typename T, template <typename...> class Container>
Tok<T,Container>::Tok(std::initializer_list<T> list){
auto it2=collection.end();
for(auto it1=list.begin(); it1!=list.end(); it1++) {
{collection.insert(it2,*it1); it2++;}
}
}
但它没有用,程序崩溃并抛出内存错误。 然后我稍微改变了它并让它使用下一个实现工作:
template <typename T, template <typename...> class Container>
Tok<T,Container>::Tok(std::initializer_list<T> list){
for(auto it=list.begin(); it!=list.end(); it++)
collection.insert(collection.end(),*it);
}
现在我的问题是为什么第一个不起作用,这两个有什么区别?(我使用开始而不是结束得到相同的结果)
最佳答案
插入像std::vector
这样的容器可能invalidate iterators .
在您的第一个示例中,在您向 collection
中插入内容后,it2
不再有效(因为 vector 可能不得不重新分配其存储空间)但是你增加它并在下一次迭代中再次使用它。在您的第二个示例中,它之所以有效,是因为您在每次迭代中都会获得一个新的结束迭代器。
您可以使用 insert
解决第一个示例中的问题。的返回值。它将返回一个指向插入值的有效迭代器,您可以将其分配给 it2
。如果您想将多个元素插入容器中间,这也适用,如下所示:
auto pos = getInsertPosition();
for(auto &val : source) {
pos = destination.insert(pos, val);
}
关于c++ - 使用算法中的插入函数在空容器中插入元素未给出预期结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56612395/