std::merge merging two std::vector coredump
std::merge merging two std::vector coredump
以下代码以核心转储结束。我做错了什么?
std::vector<int> a;
a.push_back(1);
a.push_back(4);
a.push_back(7);
std::vector<int> b;
b.push_back(2);
b.push_back(5);
b.push_back(8);
std::vector<int> c;
c.clear();
std::merge(a.begin(), a.end(), b.begin(), b.end(), c.begin());
for (it=c.begin(); it!=c.end(); ++it)
std::cout << *it << endl;
我可以在 stl 或 boost 中使用任何其他合并功能吗?
谢谢!
问题是你的c
是空的,因为它是用没有元素初始化的,更不用说不必要的clear()
调用了。 std::merge()
将输出迭代器作为其最后一个参数。如果c.begin()
指的是已经包含足够元素的std::vector
的开头,那么这不是问题 - 这些元素将被覆盖。实际上,通过将值写入向量末尾之后的内存来调用未定义的行为。
为了确保c
有足够的空间容纳元素,您可以这样做:
c.resize(a.size() + b.size());
std::merge(a.begin(), a.end(), b.begin(), b.end(), c.begin());
但是,使用std::back_insert_iterator
,调用push_back()
的输出迭代器更习惯。为了提高效率,您可以事先在向量上调用reserve()
。这可确保c
只需要分配一次内存,而不是在调用 std::merge()
期间随着内存的增长而增加。最终解决方案如下所示:
#include <iterator>
// ...
c.reserve(a.size() + b.size());
std::merge(a.begin(), a.end(), b.begin(), b.end(), std::back_inserter(c));
std::merge(a.begin(), a.end(), b.begin(), b.end(), std::back_inserter(c));
^^^^^^^^^^^^^^^^^^^^^^^
问题是,如果你传递c.begin()
,合并函数将开始将值写入*c.begin()
、*(c.begin() + 1)
等,这会导致未定义的行为,包括核心转储。您在这里有两个选择。
- 确保
c
足够大,可以容纳合并将写入其中的所有值。例如,您可以在调用c.resize(a.size()+b.size());
之前调用merge
- 传递
std::back_insert_iterator
.它的例子在我的答案开头给出。每次你*it = x
it
是back_insert_iterator
的地方,它都会push_back
x到底层容器中。
有关背面插入迭代器的信息,请参见此处。 back_inserter
只是一个方便的函数,因此您不会编写大量模板参数。
您正在尝试将结果存储在 c
中,这是空的,因此,它没有足够的空间来存储它们(实际上,它没有足够的空间来存储任何东西(。尝试使用 back_insert_iterator
,这将push_back
元素:
std::merge(a.begin(), a.end(), b.begin(), b.end(), std::back_inserter(c));
c
不够大,无法容纳合并。 尝试:
#include <iterator>
...
std::merge(a.begin(), a.end(),
b.begin(), b.end(),
std::back_inserter(c));
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何从 std::atomic 中提取指针 T<T>?
- 为什么 std::unique 不调用 std::sort?
- 使用std::函数映射对象方法
- std::merge merging two std::vector coredump