联盟与地图?

Bra*_*ble 1 c++ stl

我正在尝试联盟两套地图.我有两套,并希望将它们组合成第三套.我在push_back中遇到此代码的错误.有没有办法做到这一点?

map<char, vector<char> > numbers;
map<char, vector<char> >::iterator it;
numbers['E'].push_back('a');//set1
numbers['E'].push_back('b');
numbers['E'].push_back('c');
numbers['G'].push_back('d');//set2
numbers['G'].push_back('e');


void Create::Union(char set1, char set2, char set3)
{
    for (it = numbers.begin(); it != numbers.end(); ++it)
    {
        numbers[set3].push_back(it->second);
    }
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*sop 10

数字是一个载体,由字符键入.所以它 - >第二个是矢量.你不能将向量push_back成char的向量.

你应该迭代数字[set1]和数字[set2],而不是迭代数字.或者正如bdonlan所说,你可以插入一个范围,尽管他正在将所有数据联合起来,而不仅仅是set1和set2.

另外:在哪里item定义?你的意思是it

另请注意,push_back不会检查该值是否已在向量中.因此,一旦你了解了这个一般方法的细节,你的例子就行了,'E'和'G'的联合将是一个包含'a','b','c','d'的向量, 'E'.但如果你把'a','b','c'与'c','d','e'联合起来,你会得到'a','b','c','c', 'd','e',这可能不是你想要的工会.

假设您的向量总是要排序,您可以使用标准算法set_union:

#include <algorithm>
#include <iterator>

...

numbers[set3].clear();
std::set_union(numbers[set1].begin(), numbers[set1].end(),
               numbers[set2].begin(), numbers[set2].end(),
               std::back_inserter(numbers[set3]));
Run Code Online (Sandbox Code Playgroud)

如果你想把所有数字联合起来,我可能会选择:

vector<char> sofar;
map<char, vector<char> >::iterator it;
for (it = numbers.begin(); it != numbers.end(); ++it) {
    // new, empty vector
    vector<char> target;
    // merge everything so far with the next item from the map,
    // putting the results in target
    set_union(sofar.begin(), sofar.end(),
              it->second.begin(), it->second.end(),
              back_inserter(target));
    // the result is the new "everything so far"
    // note that this operation is very fast. It doesn't have to
    // copy any of the contents of the vector, just exchange some pointers.
    swap(target, sofar);
}
// replace numbers[set3] with the final result
swap(numbers[set3], sofar);
Run Code Online (Sandbox Code Playgroud)

要么:

set<char> sofar;
map<char, vector<char> >::iterator it;
for (it = numbers.begin(); it != numbers.end(); ++it) {
    // let std::set remove the duplicates for us
    sofar.insert(it->second.begin(), it->second.end());
}
// replace numbers[set3] with the final result
numbers[set3].clear();
numbers[set3].insert(numbers[set3].end(), sofar.begin(), sofar.end());
Run Code Online (Sandbox Code Playgroud)

这是更少的代码,可能更快,或者可能会过多地破坏内存分配器.不确定哪个更好,对于小型集合,性能几乎肯定无关紧要.

该版本set也不需要对矢量进行排序,尽管它们更快.

  • +1使用可用的STL功能更清晰的代码.我已经看到很多程序员开始编写他们自己的实现,而没有调查STL中已有的东西. (4认同)