c++ - 以固定容量初始化大小为 0 的 vector<vector<double>> 的最快方法

标签 c++ vector

最快的方法是什么:

template<typename T>
vector<vector<T>> vec_vec_init(T dummy_for_type, size_t outer_dim, size_t inner_dim) {

    vector<vector<T>> v(outer_dim);

    for (size_t i = 0; i < outer_dim; i++)
        v[i].reserve(inner_dim);
    return v;
}

即如果我有

vector<vector<double>> v = vec_vec_init((double)0, 5, 10);

然后,大小为 5 的 v vector 和每个 v[i] 都是容量为 10 的空 double vector 。

最佳答案

实际上不可能保证“最快”,但我可能会做这样的事情(假设 C++11 或更高版本)

template<typename T>
std::vector<std::vector<T> > vec_vec_init(std::size_t outer_dim, std::size_t inner_dim)
{
    std::vector<std::vector<T> > v(std::vector<T>(0), outer_dim);
    for (auto &i : v) i.reserve(inner_dim);
    return v;
}

备注;

  • 我添加了 std::命名空间 std 中那些东西的前缀,因为像这样的模板函数可能会在头文件中定义。有许多解释(在 SO 和其他地方,使用谷歌很容易找到)解释为什么 using namespace std;在头文件中是个坏主意。
  • 这使用迭代器,它有潜力(不能保证,但通常是公平的赌注)提供比标准容器上的数组索引更好的性能。主观上,很多程序员(至少,一旦他们掌握了使用迭代器的诀窍)也发现迭代器比数组索引更容易使用。
  • 我已经删除了 dummy_for_type争论,因为我认为像 v = vec_vec_init<Something>(outer, inner) 这样的电话比 v = vec_vec_init(Something(0), outer, inner) 更清晰或者(如果 Something 不能初始化为 0 ) vec_vec_init(dummy_Something, outer, inner) .

在 C++11 之前,我不会费心使用这样的函数,因为它会按值返回。按值复制 vector 可以保证保留大小(除非复制失败并抛出异常)但不能保证保留容量。在这种情况下,这也适用于内部 vector 。

所以我可能会完全取消该功能,只需这样做

std::vector<std::vector<Something> > v(outer);
for (auto &i : v) i.reserve(inner);

或者(如果我要求代码在 C++11 之前工作)

std::vector<std::vector<Something> > v(outer);
std::vector<std::vector<Something> >::iterator i = v.begin(), end = v.end();
while (i != end)
{
     i->reserve(inner);
     ++i;
}

关于c++ - 以固定容量初始化大小为 0 的 vector<vector<double>> 的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41479535/

相关文章:

c++ - 在 C++ 中使用 size_type 时,推荐使用 for 循环索引进行算术运算的方法是什么?

c++ - 循环比较(优化)

c++ - 将 Mat 转换为 <vector<vector>> C++

c++ - WGS84中2个 “linearly”运动对象之间的碰撞检测

c++ - 从我的英特尔系统中检测 CPU 和核心信息

c++ - libsigc 如何包含在 gtkmm 项目中?

c++ - 知道我的顶点是否(以及如何)被重新排序

c++ - 初始化 vector 的 vector ,其中并非所有 vector 的大小都相同 C++

java - 如何将角度转换为 vector

python - 修改列表中的一个对象会修改列表中的所有对象