我创建了下一个元组
std::tuple<double, double, double> m_size = std::make_tuple(1.0, 1.0, 1.0);
我需要将元组的每个元素乘以一个coeff等于2.0并得到像
这样的结果(2.0,2.0,2.0)
我可以这样做
std::get<0>(m_size) *= 2.0;
std::get<1>(m_size) *= 2.0;
std::get<2>(m_size) *= 2.0;
还有哪些其他选择可以做同样的事情?
答案 0 :(得分:2)
你将不得不将每个元素相乘,但是像这样的东西将减少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;
}
答案 1 :(得分:0)
如何更有效地完成这项工作?
在执行性能方面:你不能......每次乘法都会涉及CPU的FPU,每次乘法都需要单独完成那里。
如果你想获得更简单的代码(一旦编译,仍然分别进行乘法运算......),你可能会尝试为元组实现某种for_each
,可能基于此{{3}这样你就可以像这样写一个单行:
foreach(m_size, [](double& v) { v *= 2; });
不确定这是否符合 效率的定义,但是......
由于类型完全相同,您可以切换到std::array<double, 3>
,然后使用标准库std::for_each
。通过提供基于范围的包装器(遗憾的是尚未存在于标准库中),甚至可以进一步简化这一过程:
template <typename C, typename F>
void for_each(C& c, F&& f)
{
std::for_each(c.begin(), c.end(), std::move(f));
}