从std :: set合并相邻条目

Merging adjacent entries from a std::set

本文关键字:合并 std set      更新时间:2023-10-16

我有一个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 
        }

沿这些行(未测试,甚至没有编译):

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);