在c ++中创建一个具有相同元素重复多次的数组

时间:2018-01-14 14:13:45

标签: c++ arrays

有一个数组:A={4,5},现在我必须将这个数组X连接成一个空数组B

例如:if x=3
然后B={4,5,4,5,4,5}

这可以这样实现:

    vector<int>B;
    while(x--){
        for(int i=0;i<N;i++){
            B.push_back(A[i]);
        }
    }

N是数组A的长度。
如果X=N这将需要O(N^2)。有更好的方法吗?

4 个答案:

答案 0 :(得分:2)

我认为你不能提高超过O(x * N)的数量级。 但是将初始矢量大小设置为

std::vector<int> B(x*N);

可以通过在某些条件下减少向量再生来略微提高性能。

答案 1 :(得分:1)

如果您要做的就是尽可能有效地扩展std::vector,那么您可以执行以下操作:

template<typename T>
void expandVector(T& vec, const size_type noOfExpansions)
{
    const size_type sizeOfVec = vec.size();
    vec.reserve(noOfExpansions * sizeOfVec);
    for(int i = 0; i < noOfExpansions; ++i)
    {
        vec.insert(vec.end(), vec.begin(), vec.begin() + sizeOfVec);
    }
}

不幸的是,在这种情况下,[2]*5没有像std::vector那样富有表现力,你可以做的最好的事情就是从上面的例子中减去一些脂肪:

const size_type sizeOfVec = vec.size();
for(int i = 0; i < noOfExpansions; ++i)
{
     vec.insert(vec.end(), vec.begin(), vec.begin() + sizeOfVec);
}

如果您希望复制然后展开,也可以剪切保存大小。

答案 2 :(得分:1)

这通常需要O(X*N),所以当 X = N 时,它将需要 O(N*N) 。在向量中插入 N 元素时,无法提高O(N)的复杂性。但是,您可以将代码缩短为:

vector<int>B,A={4,5};
int x=3;
while(x--)
    B.insert( B.end(), A.begin(), A.end() );

答案 3 :(得分:0)

你可以这样做:

int main()
{
  int k = 3;
  vector<int> v = {1,-2,3};
  vector<int> o;

  for (int i=0; i<k*v.size(); ++i) {
    o.push_back(v[i%v.size()]);
  }

  for (int i=0; i<o.size(); ++i) {
    cout<<o[i];
  }

  return 0;
}