C++ 如何使用迭代器在向量的不同位置插入多个元素?

C++ 如何使用迭代器在向量的不同位置插入多个元素?,c++,algorithm,c++11,insert,stdvector,C++,Algorithm,C++11,Insert,Stdvector,我想编写一个函数,将向量[2,1,4,0,5]更改为 [2, 2, 1, 4, 4, 4, 4, 5, 5, 5, 5, 5] 我可以通过将向量放入数组,然后将元素推回向量来实现 如何使用insert来执行此操作?我可以修改以下程序吗?最有效的方法是什么 void timesDuplicates(vector<int>& a) { int s = a.size(), count = 0; for(int i = 0; count < s ; i+=a

我想编写一个函数,将向量
[2,1,4,0,5]
更改为

[2, 2, 1, 4, 4, 4, 4, 5, 5, 5, 5, 5]
我可以通过将向量放入数组,然后将元素推回向量来实现

如何使用insert来执行此操作?我可以修改以下程序吗?最有效的方法是什么

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]); 
    }
}
void timesplicates(向量&a)
{
int s=a.size(),count=0;
对于(int i=0;count
如何使用insert来执行此操作?我可以修改以下程序吗

关于效率,每次插入时,向量可能会经历多次重新分配,就像在提供的代码中没有内存被占用一样,即使它可以通过对元素求和来完成。正如@IgorTandetnik指出的,转换传递的向量也不可能

最简单的方法是,创建一个新的向量,其中的元素数量与传递的向量中存在的元素数量相同

下面是一个示例代码()


使用递归尝试此代码段。由于您正在弹出并推入一个新的临时向量,
push_back
就足够了(插入将要求您找到新的插入位置)

void timesDuplicates(vector&vec,int idx=0)
{
静态矢量结果;
int v=vec[idx];//获取值
对于(int i=0;i这个程序不能插入但不能擦除。它不可能将
[2,1,4,0,5]
转换为
[2,2,1,4,4,4,4,5,5,5]
,因为零元素将保留。此外,它插入了太多副本。值为
x
的元素的一个副本已经存在;您只需插入
x-1
更多副本。
void timesDuplicates(vector&a){int s=a.size(),count=0;for(int i=0;count
#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;
}
#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;
}
void timesDuplicates(vector<int>& vec, int idx = 0)
{
    static vector<int> result;    
    int v = vec[idx];              // get value
    for (int i = 0; i < v; i++)    // multiply value
    {
        result.push_back(v);   // push value to temp vector (result)
    }    
    if (idx == vec.size() - 1) {   // border condition
        vec.swap(result);      // swap result
        return;                
    }    
    timesDuplicates(vec, ++idx);   // increment index   
}

void main()
{
    vector<int> vec = { 2, 1, 4, 0, 5 };
    timesDuplicates(vec);
    for (auto e : vec)
        cout << e << " ";
    cout << "\n";
}