c++ - 如何使用迭代器在向量中的不同位置插入多个元素?
问题描述
我想编写一个将向量更改为的[2, 1, 4, 0, 5]
函数
[2, 2, 1, 4, 4, 4, 4, 5, 5, 5, 5, 5]
我可以通过将向量弹出到数组中然后将元素推回向量来实现。
我怎样才能使用插入来做到这一点?我可以修改以下程序吗?最有效的方法是什么?
void timesDuplicates(vector<int>& a)
{
int s = a.size(), count = 0;
for(int i = 0; count < s ; i+=a[i], count++) {
if(a[i] == 0) continue;
a.insert(a.begin()+i, a[i], a[i]);
}
}
解决方案
我怎样才能使用插入来做到这一点?我可以修改以下程序吗?
关于效率,每次插入发生时,您的向量可能会经历多次重新分配,因为在提供的代码中没有内存被std::vector::reserve ed,即使它可以通过对元素求和来完成。就像@IgorTandetnik指出的那样,转换传递的向量也是不可能的。
您可以做的最简单的方法是创建一个新向量,其中只需根据传递的向量中存在的元素数量来添加std::vector::insert元素。
以下是示例代码。(见直播)
#include <iostream>
#include <vector>
#include <numeric> // std::accumulate
std::vector<int> timesDuplicates(const std::vector<int>& vec)
{
std::vector<int> result;
// reserve the amount of memory for unwanted reallocations
result.reserve(std::accumulate(std::cbegin(vec), std::cend(vec), 0));
// you do not need to check element == 0 here
// as std::vector::insert(end, 0, 0) will insert nothing
for (const int element : vec) result.insert(result.end(), element, element);
// return the result
return result;
}
int main()
{
const auto result{ timesDuplicates({ 2, 1, 4, 0, 5 }) };
for (const int ele : result) std::cout << ele << " ";
return 0;
}
或者,如果您不相信NRVO 或复制省略会发生,请在保留所需的内存后将向量result
作为参数(ref )传递给函数。
#include <iostream>
#include <vector>
#include <numeric> // std::accumulate
void timesDuplicates(
const std::vector<int>& vec,
std::vector<int>& result)
{
for (const int element : vec)
result.insert(result.end(), element, element);
}
int main()
{
const std::vector<int> vec{ 2, 1, 4, 0, 5 };
std::vector<int> result;
result.reserve(std::accumulate(std::cbegin(vec), std::cend(vec), 0));
timesDuplicates(vec, result);
for (const int ele : result) std::cout << ele << " ";
return 0;
}
推荐阅读
- php - 如何从另一台计算机访问本地服务器中的 php 文件
- json - 如何通过几个键使用 JOLT Transform 过滤数据
- outlook - 商店加载项窗口未打开
- javascript - Openlayers 5:修改交互,如何让顶点指向
- c - 如何从c中的引用为二维数组赋值?
- spring - spring请求body字段处理
- php - Laravel 5.6 上传图片
- python - 来自 django 变量的图像源
- vsto - 保存 vsto Excel 后功能区消失
- python - VS Code Python + 黑色格式化程序参数 - python.formatting.blackArgs