【问题标题】:How to properly access tuple's members如何正确访问元组的成员
【发布时间】:2018-05-31 01:49:05
【问题描述】:

每次我使用 std::get 访问元组时,此代码都会更新元组的 rand() 值,但我希望它被修复(初始化一次)。为什么 std::get 的行为不符合我的预期?

#include <iostream>
#include <tuple>

std::tuple<int, int> test(int a)
{
return std::make_tuple(a, rand() % 100);
}

int main()
{
test(5);
for (int i = 0; i < 10; i++)
    std::cout << std::get<1>(test(5)) << '\n';

std::cin.get();
}

【问题讨论】:

  • 因为您每次都在一个新变量上调用std::get。您希望test 返回相同的值,还是希望您的循环每次都访问相同的值?
  • 每次访问相同的值
  • 您需要使用相同的参数调用test() 并获取一次随机值,或者您需要循环打印相同的值?

标签: c++ tuples


【解决方案1】:

很难理解你,但看起来你需要这个:

auto tup = test(5);
for (int i = 0; i < 10; i++)
    std::cout << std::get<1>(tup) << '\n';

然后您将从变量tup 访问相同的值,并且您会看到std::get 不会修改它。但是如果你每次创建新的元组对象时都调用test(),那么问题是,std::get 不会修改它。

【讨论】:

    【解决方案2】:

    如果您想避免重新生成随机值,请使用函数静态变量在第一次调用时创建所需的固定返回值,然后返回该值:

    std::tuple<int, int> test(int a)
    {
        static auto randval = rand() % 100;
        return std::make_tuple(a, randval);
    }
    

    由于静态只初始化一次,只要可以在初始化时完成工作,编译器就会确保它只完成一次。

    【讨论】:

    • 问题是,这样,如果我调用 test(6),它会给我与 test(5) 相同的号码。我希望不同的 test(x) 有不同的随机数,但总是访问同一个
    • @user1000:您最初的问题是每次都传递不同的数字,所以我就这样回答了。如果你想让每个新参数缓存一个不同的值,它会变得更加复杂; static unordered_map&lt;int, int&gt;find 每个参数,然后如果 find 显示密钥不存在,则使用新生成的随机值更新将允许这样做。
    • 哦,你的意思是元组中的 unordered_map?
    • @xaxxon:不,不会。 unordered_map 将是 static,但不是 const;在每次调用时,您检查参数之前是否见过(地图是否有映射?),如果没有,则生成随机值并将其存储在地图中。然后使用该值(新生成的或在地图中找到的)生成结果tuple
    • @user1000:不。 unordered_map 会将参数映射到结果tuple 的随机分量或整个结果tuple(取决于需要)。每次调用都会查看随机值是否存在,如果没有生成并存储它,则使用找到的值或新生成的值来生成结果。
    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多