有一个数组: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)
。有更好的方法吗?
答案 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;
}