【发布时间】:2020-04-18 12:39:10
【问题描述】:
我正在尝试提高我在使用 C++ 解决问题方面的编码技能。因此,我很想知道以下三个建议示例中哪一个使用起来更快更好,以及评估性能的最佳方法。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5;
struct Car {
int id, price;
Car(int _id, int _price) : id(_id), price(_price) {}
};
struct Boat {
int id, price;
};
struct Motorcycle {
int id, price;
};
int main() {
// ------------ section1 ------------
int n1;
scanf("%d", &n1);
vector<Car> cars;
for (int i = 0; i < n1; i++) {
int id, price;
scanf("%d%d", &id, &price);
cars.emplace_back(id, price);
}
// ------------ section2 ------------
int n2;
scanf("%d", &n2);
Boat boats[N];
for (int i = 0; i < n2; i++) {
int id, price;
scanf("%d%d", &id, &price);
boats[i] = {id, price};
}
// ------------ section3 ------------
int n3;
scanf("%d", &n3);
vector<Motorcycle> motorcycles(n3);
for (auto& motorcycle : motorcycles) {
scanf("%d%d", &motorcycle.id, &motorcycle.price);
}
return 0;
}
不过,我相信普通数组比std::vector快。
【问题讨论】:
-
与 std::vector 相比,非动态普通对象数组总是至少保存一个动态分配。这可能很重要,也可能不重要:如果对象本身需要任何初始化(这会导致 O(n) 的时间复杂度),那么足够大的数字总是会超过保证 O(log n) 的向量分配。此外,如果对象执行重要的默认初始化,或者赋值代价高昂,则将 emplace_back() 放入向量中会比覆盖数组中预先存在的对象执行得更好。
-
@Peter-ReinstateMonica 因此,如果可能的话,我应该始终使用普通数组。否则,如果我必须使用
std::vector,那么在这种情况下我应该使用emplace_back()而不是push_back(),对吧?谢谢。 -
另外,第三种情况下的
for auto&呢? -
如果自动引用(是通过引擎盖下的交互器工作吗?)有什么不同,我会感到惊讶。至于使用什么:最简单、最惯用且最不容易出错的那个(通常是带有 auto 的向量)。性能差异很可能可以忽略不计。
标签: c++ performance c++11 auto emplace