empty deque vs vector
empty deque vs vector
我在STL问答题的样本中发现了以下内容
Q: 当您尝试编译并运行以下代码时会发生什么?
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <deque>
using namespace std;
void printer(int i) {
cout << i << ", ";
}
int add (int a, int b) {
return a+b;
}
int main() {
vector<int> v1 = { 3, 9, 0, 2, 1, 4, 5 };
set<int> s1(v1.begin(), v1.end());
deque<int> d1; // LINE I
transform(s1.begin(), s1.end(), v1.begin(), d1.begin(), add);//LINE II
for_each(d1.begin(), d1.end(), printer); //LINE III
return 0;
}
A compilation error in LINE III
B program outputs: 3, 10, 2, 5, 5, 9, 14,
C program outputs: 3, 9, 0, 2, 1, 4, 5,
D runtime error at LINE III
E compilation error in LINE II
F runtime error at LINE II
G program outputs: 0, 1, 2, 3, 4, 5, 9,
通过阅读代码,我预计答案是F,要么是因为1复制到零大小容器中是未定义的行为或者2 stl函数可能在运行时检查是否有足够的容量,如果没有抛出异常
我在gcc 4.8.1 上编译并运行了代码
没有编译或运行时错误。LINE III只是不打印任何内容,因为我假设d1.begin()==d1.end()。deque中没有有效元素。
但是,如果我添加LINE IV
for_each(d1.begin(), d1.begin()+7, printer); //LINE IV
它打印
3, 10, 2, 5, 5, 9, 14,
因此transform函数确实将这7个元素写入了"非托管"内存。
当我将线路I更改为时
vector<int> d1;
那么在LINE II上确实发生了运行时错误。
问题
1可以说,上面的问题没有提供正确答案的选项吗。我不确定其他编译器的行为。
2我假设,因为deque不一定使用连续存储,所以当转换函数向其写入元素时,通过deque迭代器会进行某种形式的分配。然而,deque本身的大小仍然为0。但是向量迭代器在尝试向内存写入时会导致崩溃。有人有详细的解释吗。
3当我自己编写可以接受迭代器的实用程序函数时,在不了解底层容器的情况下,处理这种情况的最佳方法是什么,即迭代器被传递到一个意外的空容器。我认为begin()==end()对于所有空容器都保证为true,所以最初执行此检查并抛出异常?
感谢
问题3的答案:
您可以使用类似的东西来验证目标容器不仅没有空,而且大小足够:
if(std::distance(d1.begin(), d1.end()) < std::distance(s1.begin(), s1.end()))
{
throw std::runtime_error("Not enough space");
}
你在问题1中的假设似乎是正确的。gcc和clang编译都没有错误。
对不起,我没有对2的详细解释,但正如你所说,这是未定义的行为。当使用libstdc++(clang和gcc)编译时,上面的示例对deque
运行良好,但当使用libc++和clang编译时,对deque
和vector
运行segfault。因此,在libstdc++中实现deque
似乎总是预先分配一些空间(即使在运行d1.shrink_to_fit()
之后)。
- Vector Push_Back VS Emplace_Back
- std::span.size() vs array/vector size
- std::array<bool> vs. std::vector <bool>的行为
- C++ vector::size_type:有符号与无符号;int vs. long
- C++ performance std::array vs std::vector
- 何时使用 Eigen::Vector vs std::vector
- 尝试将 std::vector<std::p air<T, U>> 转换为其左值引用时收到 VS 编译器警告 C4239
- 指针指针:std:vector vs. 数组
- std::vector<std::vector ><T> vs std::vector<T*>
- C++ std::vector<> vs new[] 性能
- Vector vs Deque插入中间
- std::vector vs std::array performance
- struct vs vector作为数据持有者
- empty deque vs vector
- 以一定的速度使用Map vs Vector
- Vector::at vs. vector::operator[] -- 不同的行为
- std::tuple vs std::array 作为 std::vector 的项目
- Vector vs. Array for Deck of Cards
- C++ std::vector vs 现实世界中的数组
- std::vector vs std::list for insertion frequency and dynamic