Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将std::tuple乘以某个值?_C++ - Fatal编程技术网

C++ 如何将std::tuple乘以某个值?

C++ 如何将std::tuple乘以某个值?,c++,C++,我已经创建了下一个元组 std::tuple<double, double, double> m_size = std::make_tuple(1.0, 1.0, 1.0); 我可以这样做 std::get<0>(m_size) *= 2.0; std::get<1>(m_size) *= 2.0; std::get<2>(m_size) *= 2.0; std::get(m_大小)*=2.0; 标准:get(m_尺寸)*=2

我已经创建了下一个元组

std::tuple<double, double, double> m_size = std::make_tuple(1.0, 1.0, 1.0);
我可以这样做

   std::get<0>(m_size) *= 2.0;
   std::get<1>(m_size) *= 2.0;
   std::get<2>(m_size) *= 2.0;
std::get(m_大小)*=2.0;
标准:get(m_尺寸)*=2.0;
标准:get(m_尺寸)*=2.0;

还有哪些其他选项可以做同样的事情

我怎样才能更有效地做到这一点

在执行性能方面:您不能。。。每一次乘法都将涉及CPU的FPU,并且每一次乘法都需要在那里单独完成

如果您想得到更简单的代码(编译后,仍然单独进行乘法…),您可以尝试为元组的每个_实现某种类型的
,可能基于此,这样您就可以编写一个如下所示的单行程序:

foreach(m_size, [](double& v) { v *= 2; });
不确定这是否符合你对效率的定义,不过

由于类型都相同,您可以切换到
std::array
,然后使用标准库
std::for_each
。这甚至可以通过提供基于范围的包装(不幸的是,标准库中还没有)来进一步简化:

模板
每个(C&C、F&F)的无效
{
std::for_each(c.begin()、c.end()、std::move(f));
}

您将不得不对每个元素进行乘法,但类似这样的操作将减少手动对每个元素进行std::get并进行乘法的需要,并为编译器提供一个很好的优化机会

#include <iostream>
#include <type_traits>
#include <tuple>
#include <iomanip>

template <typename T,typename Tuple, size_t... Is>
void multiply_tuple_elements(T coeff, Tuple& tuple,std::index_sequence<Is...>)
{
    using do_= int[];
    (void)do_{0, ( 
            std::get<Is>(tuple)*=coeff
    ,0)...}; 
}

int main()
{
    double coeff = 2.0;
    std::tuple<double, double, double> m_size = std::make_tuple(1.0, 1.0, 1.0);
    multiply_tuple_elements(
            coeff,
            m_size ,
            std::make_index_sequence<std::tuple_size<decltype(m_size)>::value>()
    );

    std::cout << std::fixed;
    std::cout << std::get<0>(m_size) << std::endl;
    std::cout << std::get<1>(m_size) << std::endl;
    std::cout << std::get<2>(m_size) << std::endl;

    return 0;
}
#包括
#包括
#包括
#包括
样板
void multiply\u tuple\u元素(T系数、tuple&tuple、std::index\u序列)
{
使用do_uz=int[];
(void)do_{0,(
std::get(元组)*=coeff
,0)...}; 
}
int main()
{
双系数=2.0;
std::tuple m_size=std::make_tuple(1.0,1.0,1.0);
乘法\u元组\u元素(
科夫,
m_尺寸,
std::make_index_sequence()
);

std::难道除了将每个元素相乘之外没有其他方法了吗?如果您想要更有效的方法,您需要发布您的代码或算法。您可以查看std::multiplies@Sniper我不知道元组有什么特殊的用法吗?我不明白为什么是负数?你能解释一下吗?@Sniper,你知道我怎么用std::multiples吗我会很出色的。
template <typename C, typename F>
void for_each(C& c, F&& f)
{
    std::for_each(c.begin(), c.end(), std::move(f));
}
#include <iostream>
#include <type_traits>
#include <tuple>
#include <iomanip>

template <typename T,typename Tuple, size_t... Is>
void multiply_tuple_elements(T coeff, Tuple& tuple,std::index_sequence<Is...>)
{
    using do_= int[];
    (void)do_{0, ( 
            std::get<Is>(tuple)*=coeff
    ,0)...}; 
}

int main()
{
    double coeff = 2.0;
    std::tuple<double, double, double> m_size = std::make_tuple(1.0, 1.0, 1.0);
    multiply_tuple_elements(
            coeff,
            m_size ,
            std::make_index_sequence<std::tuple_size<decltype(m_size)>::value>()
    );

    std::cout << std::fixed;
    std::cout << std::get<0>(m_size) << std::endl;
    std::cout << std::get<1>(m_size) << std::endl;
    std::cout << std::get<2>(m_size) << std::endl;

    return 0;
}