3

我有两张地图,我需要找到差异并创建一个只有差异的新地图。不知道该怎么做。我尝试使用 set_difference 但并不真正了解它是如何工作的。任何帮助,将不胜感激。谢谢

// header file
typedef std::map<std::string, int> MapCol;
typedef std::map<std::string, MapCol> MapRow;
MapRow m_mapRows;

//.cpp fle
CheckForDifferences( const Table& rhs )
{
    Table diffTable;
    vector<string> v;                           
    vector<string>::iterator it;
    it=set_difference (m_mapRows.begin(), m_mapRows.end(), diffTable.m_mapRows.begin(), diffTable.m_mapRows.end, v.begin());
}

编辑:

std::set_difference( m_mapRows.begin(), m_mapRows.end(),
rhs.m_mapRows.begin(), rhs.m_mapRows.end(), diffTable.m_mapRows.begin());

好的,这就是我尝试的方法,但我得到了错误,第一个错误是错误 C2678: binary '=' : no operator found 它采用'const std::string' 类型的左操作数(或者没有可接受的转换)

有任何想法吗?

4

3 回答 3

5

如果您有两个已排序的容器ab并且您想将不在其中的一组对象复制到另一个容器中c,您可以这样做:

std::set_symmetric_difference(
    a.begin(), a.end(),
    b.begin(), b.end(),
    std::back_inserter(c) );

如果您只想要其中的元素a不在 中b,请使用set_difference而不是set_symmetric_difference.

于 2012-11-02T19:07:18.213 回答
2

在您的代码中

std::set_difference( m_mapRows.begin(), m_mapRows.end(),
rhs.m_mapRows.begin(), rhs.m_mapRows.end(), diffTable.m_mapRows.begin());

您尝试使用常规迭代器作为输出,这是行不通的。在您的情况下,您可以使用std::inserter

std::set_difference( m_mapRows.begin(), m_mapRows.end(),
rhs.m_mapRows.begin(), rhs.m_mapRows.end(), std::inserter( diffTable.m_mapRows, diffTable.m_mapRows.begin()));
于 2017-04-13T13:23:41.837 回答
1

这是我的看法。很基础。您从左侧操作数的副本开始,并删除右侧操作数中存在的所有内容。它给你留下了集合论定义的差异。

template< class TMap >
auto    MapDiff( const TMap & lh, const TMap & rh )
{
  auto result = lh ;

  for( auto const & item : rh )
  {
    result.erase( item.first ) ;
  }

  return result ;
}
于 2017-04-04T12:44:22.207 回答