合并来自 std::set 的相邻条目

Posted

技术标签:

【中文标题】合并来自 std::set 的相邻条目【英文标题】:Merging adjacent entries from a std::set 【发布时间】:2016-12-21 22:53:23 【问题描述】:

我有一个 STL 集,其中包含根据自定义谓词排序的特殊字符串元素。每个字符串都使用其水平位置(而不是文本)对其自身进行排序。我试图通过将首尾相连的字符串合并在一起,使用单个字符串对象将一行上的相邻字符串合并在一起。到目前为止,我已经设法找到了这些相邻的集合元素

我需要通过 std::set<type> 复制非相邻元素,然后使用指定的谓词将相邻元素合并在一起(参见下面的 lambda)。谁能帮我详细介绍一下。

这是我用来构造一组这些特殊 VCDUText 元素的集合排序比较器(基本上是带有 X、Y 和一些额外属性的字符串)。比较器基本上根据其与屏幕的偏移量对文本进行排序,其中包含MAXCOL 列。

static const auto gPositionComp =
    [](const VCDUText& lhs, const VCDUText& rhs) -> bool 
        auto lhsPos = lhs.mY * MAXCOL + lhs.mX;
        auto rhsPos = rhs.mY * MAXCOL + rhs.mX;
        return lhsPos < rhsPos;
    ;

removedText 在下面初始化(未显示)。我遇到麻烦的地方是以某种方式尝试将元素从removedText 复制到tempResult,同时合并相邻的条目。请注意,所有元素可能相邻,在这种情况下,结果应该只是包含合并字符串的 1 个元素。

        std::set<VCDUText, decltype(gPositionComp)> removedText(gPositionComp);
        // initialized here ...

        //....
        // transform removed entries to spaces
        std::set<VCDUText, decltype(gPositionComp)> tempResult (gPositionComp);
        std::for_each(removedText.cbegin(), removedText.cend(),
            [&tempResult](const VCDUText& rNext) 
                tempResult.emplace(rNext.mText, WHITE, BIG_CHAR, NONE, rNext.mX, rNext.mY);
            );

        auto adjIter = std::adjacent_find(tempResult.cbegin(), tempResult.cend(), 
            [](const VCDUText& lhs, const VCDUText& rhs)
                if (lhs.mX + lhs.mText.size() == rhs.mX) 
                    return true;
                
                return false;
            );

        std::set<VCDUText, decltype(gPositionComp)> temp1 (gPositionComp);
        while (adjIter != tempResult.cend()) 
            // HELP NEEDED HERE HOW DO I MERGE THE ADJACENT ELEMENTS 
        

【问题讨论】:

【参考方案1】:

类似的东西(未经测试,甚至未经编译):

if (removedText.empty()) return;
std::set<VCDUText, decltype(gPositionComp)> tempResult(gPositionComp);
auto current = removedText.cbegin();
VCDUText accum = *current++;
while (current != removedText.end()) 
  if (accum.mX + accum.mText.size() == current->mX) 
    accum.mText += current->mText;
   else 
    tempResult.emplace(accum.mText, WHITE, BIG_CHAR, NONE, accum.mX, accum.mY);
    accum = *current;
  
  ++current;

tempResult.emplace(accum.mText, WHITE, BIG_CHAR, NONE, accum.mX, accum.mY);

【讨论】:

以上是关于合并来自 std::set 的相邻条目的主要内容,如果未能解决你的问题,请参考以下文章

Python中可变数据的重复数据删除/合并

MySQL,如何合并表重复条目[重复]

合并两个数组并删除php中的重复条目

在 R 中合并两个数据帧,没有重复的条目

SQL Server 合并重复条目

合并多个表中的最新条目