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;
}