C++11 展平地图中的矢量 C++中,我有一个映射INT,vector >或map < int,vector >某个结构>,我需要在这个映射中连接向量并返回结果。
该函数的第一个版本如下:C++11 展平地图中的矢量 C++中,我有一个映射INT,vector >或map < int,vector >某个结构>,我需要在这个映射中连接向量并返回结果。,c++11,dictionary,vector,constants,C++11,Dictionary,Vector,Constants,该函数的第一个版本如下: #include <algorithm> #include <vector> vector < double > flattenRecords(const map < int, vector < double > > & selected, int num_kept_reps) { vector < double > records; int cnt = 0; for (aut
#include <algorithm>
#include <vector>
vector < double >
flattenRecords(const map < int, vector < double > > & selected, int num_kept_reps)
{
vector < double > records;
int cnt = 0;
for (auto it = selected.begin(); it != selected.end(); ++it) {
records.insert(records.end(),
make_move_iterator(it->second.begin()),
make_move_iterator(it->second.end()));
cnt += 1;
if (cnt >= num_kept_reps)
break;
}
return records;
}
我想这就是我想要做的
我对C++很陌生。STL给了我一种用python编码的感觉,所以我想试试。如果不想移动元素,请使用迭代器,而不是使用make\u move\u迭代器。例如:
records.insert(records.end(), it->second.begin(), it->second.end());
正如你所猜测的,你的第二个版本确实实现了你想要实现的目标。
关于您关于常量映射上的std::move的问题,在这种情况下std::move不会起任何作用。由于std::move是无条件强制转换为右值的,因此它将元素强制转换为对右值的常量引用。因为它是const,所以在本例中它将匹配左值向量copy,而不是move copy
例如:
这将调用std::string的复制构造函数,而不是移动构造函数。因此,它将进行复制,而不是移动
这将执行以下操作:
std::string s1 = "Test";
const std::string s2 = std::move(s1);
两个示例中的s2参数不必都是常量。复制/移动没有任何区别。如果不想移动元素,请使用迭代器,而不是使用make\u move\u迭代器。例如:
records.insert(records.end(), it->second.begin(), it->second.end());
正如你所猜测的,你的第二个版本确实实现了你想要实现的目标。
关于您关于常量映射上的std::move的问题,在这种情况下std::move不会起任何作用。由于std::move是无条件强制转换为右值的,因此它将元素强制转换为对右值的常量引用。因为它是const,所以在本例中它将匹配左值向量copy,而不是move copy
例如:
这将调用std::string的复制构造函数,而不是移动构造函数。因此,它将进行复制,而不是移动
这将执行以下操作:
std::string s1 = "Test";
const std::string s2 = std::move(s1);
两个示例中的s2参数不必都是常量。关于复制/移动,这没有什么区别。有一个“pythonic”替代方案,如果您来自Python,您可能会喜欢它,使用lambda和映射的reduce函数
std::vector<double> merged = std::accumulate(selected.begin(),
selected.end(),
std::vector<double>(),
[](const std::vector<double>& a, std::vector<double>& b)
{
std::vector<double> result(a);
std::copy(b.begin(), b.end(), std::back_inserter(result));
return result;
});
);
std::move实际上并不移动数据。它将引用强制转换为r值引用,如果该引用是非常量的,则它是移动构造函数可以使用的可移动数据类型。但它永远不会删除常量类型限定符,因此在常量引用上使用std::move不会将其强制转换为可移动类型。有一种“pythonic”替代方法,如果您来自Python,则可以使用lambda和映射的reduce函数
std::vector<double> merged = std::accumulate(selected.begin(),
selected.end(),
std::vector<double>(),
[](const std::vector<double>& a, std::vector<double>& b)
{
std::vector<double> result(a);
std::copy(b.begin(), b.end(), std::back_inserter(result));
return result;
});
);
std::move实际上并不移动数据。它将引用强制转换为r值引用,如果该引用是非常量的,则它是移动构造函数可以使用的可移动数据类型。但它永远不会删除常量类型限定符,因此在常量引用上使用std::move不会将其强制转换为可移动类型