用其自己的内容扩展 Vector 的有效方法
在 C 语言中,向量容器广泛用于动态内存管理。当涉及到将向量的内容附加到自身而不使用循环时,开发人员经常寻找有效的解决方案。
一种方法涉及使用 std::copy 函数。但是,正如问题中提到的,这可能会导致分段错误。原因是简单地将元素复制到现有向量的末尾会与原始元素占用的内存重叠。
更可靠的解决方案采用 std::resize 的组合和 std::copy_n。以下代码片段演示了此方法:
auto old_count = xx.size(); xx.resize(2 * old_count); std::copy_n(xx.begin(), old_count, xx.begin() + old_count);
此方法的工作原理是首先使用 std::resize 增加向量的容量。由于 std::resize 会在必要时重新分配内存,因此我们需要使用 old_count 变量来记住原始大小。随后的 std::copy_n 操作将原始元素复制到新分配的内存,从而有效地复制向量的内容。
std::resize 的替代方法是 std::reserve,它只分配足够的内存来保存指定数量的元素。但是,使用 std::reserve 后,仍然需要 std::copy_n,因为结束迭代器指向向量末尾的一个元素,使其无法插入。
需要注意的是,std::insert 和 std::push_back 都可能需要重新分配,这可能会使插入点之前的现有迭代器和引用无效。因此,为了在不使用循环的情况下将向量附加到自身,可以使用 std::resize 或 std::reserve 和 std::copy_n 提供可靠、高效的解决方案。
以上是如何在 C 中有效地扩展向量及其自己的内容?的详细内容。更多信息请关注PHP中文网其他相关文章!