以前没有使用过set_intersection,但我相信它适用于地图。我编写了以下示例代码,但它没有给出我期望的内容:
#include <map>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
struct Money
{
double amount;
string currency;
bool operator< ( const Money& rhs ) const
{
if ( amount != rhs.amount )
return ( amount < rhs.amount );
return ( currency < rhs.currency );
}
};
int main( int argc, char* argv[] )
{
Money mn[] =
{
{ 2.32, "USD" },
{ 2.76, "USD" },
{ 4.30, "GBP" },
{ 1.21, "GBP" },
{ 1.37, "GBP" },
{ 6.74, "GBP" },
{ 2.55, "EUR" }
};
typedef pair< int, Money > MoneyPair;
typedef map< int, Money > MoneyMap;
MoneyMap map1;
map1.insert( MoneyPair( 1, mn[0] ) );
map1.insert( MoneyPair( 2, mn[1] ) );
map1.insert( MoneyPair( 3, mn[2] ) ); // (3)
map1.insert( MoneyPair( 4, mn[3] ) ); // (4)
MoneyMap map2;
map2.insert( MoneyPair( 3, mn[2] ) ); // (3)
map2.insert( MoneyPair( 4, mn[3] ) ); // (4)
map2.insert( MoneyPair( 5, mn[4] ) );
map2.insert( MoneyPair( 6, mn[5] ) );
map2.insert( MoneyPair( 7, mn[6] ) );
MoneyMap out;
MoneyMap::iterator out_itr( out.begin() );
set_intersection( map1.begin(), map1.end(), map2.begin(), map2.end(), inserter( out, out_itr ) );
cout << "intersection has " << out.size() << " elements." << endl;
return 0;
}
由于标记为(3)和(4)的对出现在两个地图中,我期待我在交集中得到2个元素,但不,我得到:
intersection has 0 elements.
我确定这与地图/对上的比较器有关,但无法弄明白。
答案 0 :(得分:6)
Niki对你的错字当然是正确的 - map2
在这里是空的!但是你需要注意别的事情。
假设您的代码如下所示:
MoneyMap map1;
map1.insert( MoneyPair( 1, mn[1] ) );
map1.insert( MoneyPair( 2, mn[2] ) );
map1.insert( MoneyPair( 3, mn[3] ) ); // (3)
map1.insert( MoneyPair( 4, mn[4] ) ); // (4)
MoneyMap map2;
map2.insert( MoneyPair( 3, mn[4] ) ); // (3)
map2.insert( MoneyPair( 4, mn[3] ) ); // (4)
map2.insert( MoneyPair( 5, mn[6] ) );
map2.insert( MoneyPair( 6, mn[5] ) );
map2.insert( MoneyPair( 7, mn[1] ) );
MoneyMap out;
MoneyMap::iterator out_itr( out.begin() );
set_intersection(map1.begin(), map1.end(),
map2.begin(), map2.end(),
inserter( out, out_itr ) );
现在,会发生什么?您会发现out
为空,因为set_intersection
使用std::less
来比较元素,而地图的元素是成对的 - 因此(3,mn [3])与(3,mn [4])。
你能做到的另一种方法是写
set_intersection(map1.begin(), map1.end(),
map2.begin(), map2.end(),
inserter( out, out_itr ), map1.value_comp() );
现在,out
将包含两个元素:(3,mn [3])和(4,mn [4]),因为它们的键匹配。始终从第一个迭代器范围复制元素。
请注意,地图始终按其包含的map::value_compare
类型进行排序。如果您正在使用时髦的比较函数,如果地图的元素不符合set_intersection
的顺序,则std::less
将无法使用显式提供的比较函数。
答案 1 :(得分:5)
MoneyMap map2;
map1.insert( MoneyPair( 3, mn[3] ) ); // (3)
map1.insert( MoneyPair( 4, mn[4] ) ); // (4)
map1.insert( MoneyPair( 5, mn[5] ) );
map1.insert( MoneyPair( 6, mn[6] ) );
map1.insert( MoneyPair( 7, mn[7] ) );
除非这是一个拼写错误,否则您只需将内容重新插入到map1中,而不是插入到map2中。我用校正后的代码对其进行了测试,并输出了“Intersection有2个元素。”