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

标签 c++ algorithm c++11 stl

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

关于c++ - 合并来自 std::set 的相邻条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41273280/

相关文章:

c++ - 我可以持有 std::list 的新插入元素的迭代器并使用迭代器稍后安全地删除该元素吗?

c++ - 直接访问硬盘?

arrays - 如何从 n 个数组中找到公共(public)元素

c++ - 为什么 std::remove_pointer 也删除 const 限定符

c++ - const 引用和虚拟模板继承

C++:默认初始化模板函数中的整数类型

c++ - 有什么方法可以根据参数值进行函数签名匹配吗?

algorithm - 带 if-else block 的 for 循环的时间复杂度

c++ - 比较两个(非 STL) map 是否相等

c++ - 使用具有派生类值的基类函数