我正在尝试为在线评委(不是现场比赛)提交挑战,而且我的代码勉强。由于所涉及的限制很大,每一个小优化都很重要 - 所以我正在寻找加快速度的地方。
我已经使用了printf / scanf,unordered_map等
但我也使用矢量,如下:
vector<int> myVec;
unordered_map<int, vector<int> > mapToSomeVec;
vector< vector<int> > vecOfVecs;
anotherVecofVecs = vector< vector<int> >(N+1, vector<int>(1));
regularVec[index].push_back(element);
(这些只是为了显示我正在使用的声明类型以及我如何使用它们。)
是否有更快的&#34;根据我在此发布的内容,在最小化整体运行时方面等效?
答案 0 :(得分:5)
(男人,你必须做一些类似于这个人的事How to run this code in less than 1 second?)
我认为在那篇文章中给出的答案对你有帮助。矢量并不慢,但根据你的任务,矢量矢量可能会有所改善。
最明显的优化机会是,而不是使用vector<vector<int>>
使用vector<int>
并手动将2D索引调整为1D。您可以编写一个简单的包装类来为您执行此操作。
更快的原因是所有内存将被分配为单个连续单元。如果你有一个向量向量,那么每一行都会在其他地方,你会有很多缓存未命中。
这是一个代码示例:
struct 2D_Vector {
std::vector<int> me_;
int ncols_;
2D_Vector(int nrows, int ncols) : me_(nrows * ncols), ncols_(ncols) {}
int & get(int y, int x) { return me_[y * ncols_ + x]; }
const int & get(int y, int x) const { return me_[y * ncols_ + x]; }
...
};
答案 1 :(得分:-1)
std :: map比vector更快