【问题标题】:Create a vector with repeated entries of each Element使用每个元素的重复条目创建一个向量
【发布时间】:2020-09-03 11:25:25
【问题描述】:

我想通过重复每个条目三次来扩展给定向量。例如,如果向量是[5,7]。输出向量应该是[5 5 5 7 7 7]

#include<iostream.h>
#include<vector.h>

int main(void)
{
   std::vector<int> x;
   x.push_back(5);
   x.push_back(7);
   x.insert(x.end(), x.begin(), x.begin() + 1);

return 0;
}

这没有成功。任何帮助将不胜感激。

【问题讨论】:

  • .h 后缀来看,您使用的是过时的C++ 编译器吗?推荐:Why doesn't a simple “Hello World”-style program compile with Turbo C++?
  • 谢谢,我去看看。忽略这一点,插入函数是否正确编写以达到目的?谢谢
  • 不幸的是,插入行具有未定义的行为,因为 x.begin()x.begin() + 1 是向量本身的迭代器。请参阅documentation
  • 创建一个新向量而不是修改现有向量会更简单、更高效
  • @Damien 我同意。什么是更清洁的方法来完成这项工作?

标签: c++


【解决方案1】:

一种简单的方法是遍历向量并创建一个新的:

std::vector<int> vec{5, 7};

// create a new vector
std::vector<int> new_vec;
new_vec.reserve(vec.size() * 3);

for (auto elem : vec) {
    for (std::size_t i = 0; i < 3; ++i) {
        new_vec.push_back(elem);
    }
}

【讨论】:

    【解决方案2】:

    我不知道你想要多简单的代码,但例如这可以工作。

    #include<iostream>
    #include<vector>
    
    int main(void)
    {
       std::vector<int> x;
       x.push_back(5);
       x.push_back(7);
       for (std::vector<int>::iterator it = x.end(); it != x.begin(); )
       {
          it--;
          it = x.insert(it, 2, *it);
       }
    
       // print the vector to check
       for (size_t i = 0; i < x.size(); i++) std::cout << x[i] << " ";
       std::cout << std::endl;
    
       return 0;
    }
    

    【讨论】:

      【解决方案3】:

      也许这样的事情可以帮助您实现这一目标:

      #include <iostream>
      #include <algorithm>
      #include <vector>
      
      template<typename T>
      std::vector<T> RepeateEntryNumberOfTimes(std::vector<T> input, std::uint16_t numberOfTimes)
      {
          std::vector<T> result;
      
          std::for_each(input.begin(), input.end(), [&result, numberOfTimes](T item){ 
              for(std::uint16_t numberOfReps = 0; numberOfReps != numberOfTimes; ++numberOfReps)
              {
                  result.push_back(item);
              }
          });
      
          return result;
      }
      

      见神螺栓示例:https://godbolt.org/z/ns9o3b

      【讨论】:

        【解决方案4】:

        您的代码有问题,因为它将元素插入到同一个向量中。 修改向量会使旧迭代器失效,因此您的代码具有未定义的行为。

        即使忽略此错误,您的代码逻辑似乎也不符合您的预期。

        template<typename In, typename Out>
        Out replicate_elements(In b, In e, size_t n, Out o)
        {
            while(b != e) {
                o = std::fill_n(o, n, *b++);
            }
            return o;
        }
        
        std::vector<int> foo(const std::vector<int>& x)
        {
            std::vector<int> r;
            r.reserve(x.size() * 3);
            replicate_elements(x.begin(), x.end(), 3, std::back_inserter(r));
            return r;
        }
        

        https://www.godbolt.org/z/zvE5TG

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多