c++ - 使用算法中的插入函数在空容器中插入元素未给出预期结果

标签 c++ templates containers

我正在做一些功课,其中包括一个带有很多方法和构造函数的通用类,但我只对以下构造函数感兴趣,我从初始化列表中获取元素并将它们放入我的容器中:

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/

相关文章:

c++ - 在 C++ 中使用 gRPC 时未解析的外部符号

ios - 如何在容器 View 中的 tableview 周围获取可见框架

c++ - 内存管理和 C++ 容器类

c++ - 多个视频渲染期间图片颜色错误

c++ - 是否有一种惯用的方法来返回一个可选择拥有其值的指针

python - 在 Python 中导入 C++ 共享对象时出现段错误

c++ - 检查/修改迭代器 "constness"

c++ - 编译器是否为每个 lambda 生成不同的类型?

html - 居中 flexbox 元素

docker - 在Bluemix上-处理容器组实例的卷