gpt4 book ai didi

c++ - 使用带有 set_intersection 的 map

转载 作者:太空狗 更新时间:2023-10-29 19:50:24 36 4
gpt4 key购买 nike

以前没有使用过 set_intersection,但我相信它可以与 map 一起使用。我编写了以下示例代码,但它没有给我预期的结果:

#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) 的对出现在两个 map 中,我原以为我会在交集处得到 2 个元素,但没有,我得到:

intersection has 0 elements.

我确定这与 map /对上的比较器有关,但无法弄清楚。

最佳答案

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 来比较元素,而你的 map 的元素是成对的 - - 因此 (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 始终按它们包含的 map::value_compare 类型排序。如果您使用的是时髦的比较函数,如果 map 的元素恰好与 std::不一致,则在没有显式提供比较仿函数的情况下,set_intersection 将无法工作:更少

关于c++ - 使用带有 set_intersection 的 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2633999/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com