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不会将其强制转换为可移动类型