我有一个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
}
答案 0 :(得分:2)
这些方面的东西(未测试,甚至没有编译):
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);