【问题标题】:C++ tuples: time complexity for get(i)C++ 元组:get(i) 的时间复杂度
【发布时间】:2022-01-01 06:59:17
【问题描述】:

我想在 c++ 中访问元组 (https://en.cppreference.com/w/cpp/utility/tuple/get) 的位置 i 处的元素。\ 例如,如果我有:\

std::tuple <int, int, int> t{1, 2, 3};
int x = std::get<2>(t);

访问一个元素的时间是恒定的还是线性的?

【问题讨论】:

  • 时间恒定。
  • 一切都在编译期间完成。如果您在某处访问其他 int 时寻址元组中的第 n 个 int,它应该是相同的。
  • @Klaus 不是真的,这里还有一些(不多,诚然,但仍然)运行时工作。它更类似于访问结构的任意成员,而不是“某处的其他 int”。
  • 由于 tuple 的大小是恒定的,即使需要对 tuple 进行“线性”遍历,它仍然可以作为常量。它是不需要的;编译器将改为在编译时预先计算元素的偏移量。但无论如何,它始终是常数,因为即使是 3 × constant == constant。
  • n² 在编译时仍然是任何 n 的常数。但是当然,理解,你想知道,例如具有 10000 个元素的元组需要大约 10000 步才能获得最后一个元素。答案是 no,访问第 0 个和第 9999 个元素需要大致相同(小)的恒定步数,并且在编译时预先计算偏移量。但它确实需要编译器在编译时执行这 10000 步,这是肯定的。

标签: c++ stl tuples


【解决方案1】:

以下两个代码块在功能上是等效的:

std::tuple<int, int, int> t{1, 2, 3};
int x = std::get<2>(t);
using __type_for_tuple_iii = struct {int __1; int __2; int __3;};
__type_for_tuple_iii t{1, 2, 3};
int x = t.__2;

注意无论元组有多少成员,这都是正确的。

如您所见,std::get&lt;&gt;(std::tuple) 本身并没有真正做太多实际的“工作”。更具体地说,它所做的几乎所有工作都保证在编译期间是可行的。运行时只剩下一个简单的内存偏移量。

所以您不妨问:“访问结构的成员有什么复杂性?”。

答案是:O(1),无论结构有多大,元组和std::get&lt;&gt; 也是如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 2021-06-09
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多