从两个向量创建一个地图

lit*_*tuk 7 c++ stl vector map

如果我有两个stl向量vect1,vect2和我想从它们生成一个映射,那么vect1中的第一个元素将对应于vect2中的第一个元素,依此类推.我怎么能以最简单的方式做到这一点?

Fer*_*cio 9

std::vector<int> a, b;
// fill vectors here...
std::map<int, int> m;
assert(a.size() == b.size());
for (size_t i = 0; i < a.size(); ++i)
    m[a[i]] = b[i];
Run Code Online (Sandbox Code Playgroud)

  • 这可行,但我会用异常或其他内容替换“assert”。没有人喜欢停止他们的程序的库调用! (2认同)

Bla*_*ace 7

这是一个使用标准库函数(和C++ 0x lambdas)的解决方案.

const int data1[] = { 0, 2, 4, 6, 8 };
const int data2[] = { 1, 3, 5, 7, 9 };
std::vector<int> vec1(data1, data1 + 5);
std::vector<int> vec2(data2, data2 + 5);
std::map<int,int> map;

// create map
std::transform(vec1.begin(), vec1.end(), vec2.begin(), std::inserter(map, map.end()), [](int a, int b)
{
    return std::make_pair(a, b);
});

// display map
std::for_each(map.begin(), map.end(), [](const std::pair<int,int>& p)
{
    std::cout << p.first << "," << p.second << "\n";
});
Run Code Online (Sandbox Code Playgroud)

注意:这假定vec1.size()不大于vec2.size().

  • 您不需要 lambda,以下内容在 C++03 `std::transform(vec1.begin(), vec1.end(), vec2.begin(), std::inserter(my_map, my_map.end()), std::make_pair&lt;int, std::string&gt;);` (3认同)

Cas*_*Cow 5

我们将使用带有 2个输入序列的std :: transform版本。(众所周知,它看起来像是采用单个序列的序列)。

您可以通过std::make_pair<v1::value_type, v2::value_type>变压器(op)进入

std::vector<int> vec1, vec2;
std::map< int, int > mergedMap;
std::transform( vec1.begin(), vec1.end(), vec2.begin(), 
       std::inserter(mergedMap, mergedMap.end() ), std::make_pair<int const&,int const&> );
Run Code Online (Sandbox Code Playgroud)

我已经测试了代码,并且可以使用GNU 4.3.2很好地编译

(我现在也用C ++ 11进行了测试。当我将make_pair更改为int const&而不是int时,它可以工作)。

如果两个输入序列的长度不同,则最好是第一个较短,而第二个序列中的后面的元素将被忽略。如果第一个较长,则会产生不确定的行为。