请看以下代码
#include<vector>
#include<iostream>
using namespace std;
int main(){
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
for(int i = 0;i < (signed)v.size();i++) // 顺序遍历
cout << v[i] << " ";
cout << endl;
for(int i = v.size() - 1;i >= 0;i--)
cout << v[i] << " ";
cout << endl;
return 0;
}
这个代码可能存在效率问题。
因为v.size
的复杂度并不一定为
O
(
1
)
O(1)
O(1)。
在不同的C++标准和不同的编译器中,size
函数的复杂度并不相同。在C++98中,由于编译器的不同,size
的时间复杂度可能为
O
(
n
)
O(n)
O(n),这可能会使得循环的复杂度不是
O
(
n
)
O(n)
O(n)而是
O
(
n
2
)
O(n^2)
O(n2)。
解决方法
#include<vector>
#include<iostream>
using namespace std;
int main(){
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
for(int i = 0,len = v.size();i < len;i++) // 顺序遍历
cout << v[i] << " ";
cout << endl;
for(int i = v.size() - 1;i >= 0;i--)
cout << v[i] << " ";
cout << endl;
return 0;
}
代码如上所示,解决方案主要有两种:
- 调用一次
size
函数后将函数值进行存储,避免重复调用的开销。 - 逆序遍历(此时只需要调用一次
size
函数)。
参考资料