gpt4 book ai didi

c++ - 是否允许将 std::vector 的元素插入到同一 vector 中?

转载 作者:IT老高 更新时间:2023-10-28 22:14:59 25 4
gpt4 key购买 nike

考虑以下 insertemplace std::vector<T> 的成员函数:

template <class... Args> iterator emplace(const_iterator position, Args&&... args);
iterator insert(const_iterator position, const T& x);
iterator insert(const_iterator position, T&& x);
iterator insert(const_iterator position, size_type n, const T& x);

如果其中一个被引用 vector 本身的元素作为参数调用怎么办?通常,它们中的每一个都会使对从 position 开始的所有元素的引用无效。 , 这可能包括参数,或者如果发生重新分配,则引用肯定包含它的 all 元素,但这是否意味着这样的调用无效或插入(似乎)首先发生?

查看一些常见的实现会得到奇怪的结果:

  • libstdc++ 在移动任何元素之前复制参数,但仅限于 const T& insert 的过载.它包含以下评论:

    The order of the three operations is dictated by the C++0x case, where the moves could alter a new element belonging to the existing vector. This is an issue only for callers taking the element by const lvalue ref (see 23.1/13).

    但 C++11 §23.1 只是容器库的简要总结,即使我们假设这指的是 §23.2.1(在 C++03 中曾经是 §23.1),§23.2.1/13 只给出了allocator-aware 容器的定义,似乎与此无关。我浏览了第 23 章,但在任何地方都没有找到任何相关内容。

  • libc++ 在移动emplace 中的任何元素之前创建一个临时的, 而在 insert它首先移动元素,但将参数引用转换为指针并调整它以确保它指向原始元素——但同样,它只在 const T& 中执行所有这些操作。重载。

  • Visual C++ 在所有情况下都会在移动任何元素之前创建一个拷贝/临时文件。

我是否错过了标准定义这种行为的地方?为什么我查看的三个 C++ 库彼此不一致?为什么 libstdc++ 注释说这只是 insert(const_iterator, const T&) 的问题?如果标准不要求它工作,为什么图书馆还要费心让它工作呢? (当然,这会花费一些本来可以避免的拷贝和/或移动。)最后,如果我正在实现一个类似于 std::vector 的容器,我应该做这个工作吗?

最佳答案

首先回答第二个问题:标准明确规定标准库允许假设当通过右值引用传递某些东西时,该右值引用是对该对象的唯一引用。这意味着它不能合法地成为 vector 的元素。 C++11 17.6.4.9/1相关部分:

  • If a function argument binds to an rvalue reference parameter, the implementation may assume that this parameter is a unique reference to this argument. ... [ Note: If a program casts an lvalue to an xvalue while passing that lvalue to a library function (e.g. by calling the function with the argument move(x)), the program is effectively asking that function to treat that lvalue as a temporary. The implementation is free to optimize away aliasing checks which might be needed if the argument was an lvalue. —end note ]

这让我们只需要处理 const T & 的情况。即使在这种情况下 libstdc++ 和 libc++ 不同,它们的最终结果是相同的——它们会正确地从传入的对象复制。标准只规定了行为,而不是实现。只要他们达到正确的行为,他们就可以了。

关于c++ - 是否允许将 std::vector 的元素插入到同一 vector 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29300408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com