以重复的方式将元素添加到 std::vector

Adding elements to std::vector in a repeated way

本文关键字:添加 std 元素 vector 方式      更新时间:2023-10-16

我想将值从一个向量复制到另一个向量,这些向量将以特定顺序存储,第二个向量将包含比第一个向量更多的元素。

例如:

vector<int> temp;
temp.push_back(2);
temp.push_back(0);
temp.push_back(1);
int size1 = temp.size();
int size2 = 4;
vector<int> temp2(size1 * size2);

现在我想像这样填充 temp2:{2, 2

, 2, 2, 0, 0, 0, 0, 1, 1, 1, 1}。

是否可以仅使用算法(例如填充)来做到这一点?

是的,可以使用std::generate_n算法:

int main() {
    std::vector<int> base{1, 0, 2};
    const int factor = 4;
    std::vector<int> out{};
    std::generate_n(std::back_inserter(out), base.size() * factor,
            [&base, counter=0]() mutable {
        return base[counter++ / factor];
    });
    for(const auto i : out) {
        std::cout << i << ' ';
    }
}

此代码打印:1 1 1 1 0 0 0 0 2 2 2 2

关键是 std::generate_n 中使用的 lambda . 它在内部计数器上运行,以根据base向量(并根据factorcounter值访问)来生成哪些值。

不,这是一个非常具体的用例,但您可以自己轻松实现它。

#include <vector>
#include <iostream>
std::vector<int> Elongate(const std::vector<int>& src, const size_t factor)
{
    std::vector<int> result;
    result.reserve(src.size() * factor);
    for (const auto& el : src)
       result.insert(result.end(), factor, el);
    return result;
}
int main()
{
   std::vector<int> temp{2, 0, 1};
   std::vector<int> real = Elongate(temp, 4);
   for (const auto& el : real)
       std::cerr << el << ' ';
   std::cerr << 'n';
}

(现场演示)