C++ 如何使用decltype简化此代码?

C++ 如何使用decltype简化此代码?,c++,c++11,C++,C++11,我必须找到一个好地方来使用decltype,从而简化代码。 还有没有一个地方是auto在这个代码中不起作用的 map<int, float> m = build_map(); std::pair<int, int> scaling_factor(2, 3); std::pair<int, int>* scaled_array = new std::pair<int, int>[m.size()]; int i(0); for(map&l

我必须找到一个好地方来使用
decltype
,从而简化代码。 还有没有一个地方是
auto
在这个代码中不起作用的

 map<int, float> m = build_map();
 std::pair<int, int> scaling_factor(2, 3);
 std::pair<int, int>* scaled_array = new std::pair<int, int>[m.size()];

 int i(0);
 for(map<int, float>::iterator it=m.begin(); it!=m.end(); it++, i++)
 {
   std::pair<int, int> tmp = *it;
   tmp.first*= caling_factor.first;
   tmp.second*= scaling_factor.second;
   scaled_array[i] = tmp;
 }
map m=build_map();
std::配对比例因子(2,3);
std::pair*scaled_数组=新std::pair[m.size()];
int i(0);
for(map::iterator it=m.begin();it!=m.end();it++,i++)
{
std::pair tmp=*it;
tmp.first*=校准系数first;
tmp.second*=标度因数.second;
缩放_阵列[i]=tmp;
}

如果我正确理解了问题,您希望使用
auto
关键字简化代码

首先想到的是循环的范围:

std::map<int, float> m = build_map();
std::pair<int, int> scaling_factor(2, 3);
std::vector<std::pair<int, int>> scaled_array;

scaled_array.reserve(m.size());

for (auto &el : m) {
    scaled_array.emplace_back(
        el.first * scaling_factor.first,
        el.second * scaling_factor.second
    );
}
std::map m=build_map();
std::配对比例因子(2,3);
std::矢量缩放_阵列;
缩放数组保留(m.size());
用于(自动和el:m){
按比例排列。安放(
el.first*比例因子first,
el.second*缩放系数
);
}

这里有一个简化:

auto m = build_map();
const std::pair<int, int> scaling_factor(2, 3);
auto* scaled_array = new std::pair<int, int>[m.size()];

int i(0);
for (std::pair<int, float> copy : m) // copy and conversion
{
    copy.first *= caling_factor.first;
    copy.second *= scaling_factor.second;
    scaled_array[i++] = copy;
}
autom=build_map();
常数std::成对比例因子(2,3);
自动*缩放_数组=新标准::对[m.大小()];
int i(0);
for(std::pair copy:m)//复制和转换
{
copy.first*=校准系数first;
copy.second*=缩放系数.second;
缩放的_数组[i++]=复制;
}
std::transform
似乎也是一个很好的改进。

或进一步:

auto m = build_map();
auto scaling_factor = std::make_pair(2, 3);
std::vector<scaling_factor> scaled_array;

但是您需要确定它是否更具可读性,特别是因为它混淆了
。second
在映射和数组之间改变了类型。

映射不起作用,至少在C++11中不起作用。是的,它在C++98中起作用,我打算使用decltype并重写代码。我回答了您的第二个问题,“还有一个地方自动在这段代码中不起作用吗?”这只是一个在C++11中不起作用的例子。哦,对不起!我现在明白了。谢谢!我会说矢量声明……如果对匹配了映射一。@rustyx:的确,通过将
自动
(即
std::pair
)替换为
std::pair
,修复了这个问题。
auto scaled_array = new decltype(scaling_factor)[m.size()];