Question Details

No question body available.

Tags

c++ string swap

Answers (4)

September 8, 2025 Score: 6 Rep: 229,894 Quality: Medium Completeness: 70%

You might swap the common size and rotate the remaining part:

void swapInPlace(std::string& s, sizet a, sizet nexta, sizet b, sizet nextb)
{
    const auto minlength = std::min(nexta - a, nextb - b);

std::swapranges(s.begin() + a, s.begin() + a + minlength, s.begin() + b); if (nexta - a < nextb - b) { std::rotate(s.begin() + nexta, s.begin() + b + minlength, s.begin() + nextb); } else { std::rotate(s.begin() + a + minlength, s.begin() + nexta, s.begin() + next_b); } }

Demo

September 9, 2025 Score: 2 Rep: 14,418 Quality: Low Completeness: 50%

A common implementation of rotate uses reverse. Let's do that directly:

void swapInPlace(std::string& data, sizet a, sizet nexta, sizet b, sizet nextb) { auto ba = data.begin() + a; auto ea = ba + (nexta - a); auto bb = data.begin() + b; auto eb = bb + (nextb - b); // example: // ba ea bb // | | | eb // | | | | // v v v v // abc1234rst78xyz std::reverse(ba, ea); // abc4321rst78xyz std::reverse(ea, bb); // abc4321tsr78xyz std::reverse(bb, eb); // abc4321tsr87xyz std::reverse(ba, eb); // abc78rst1234xyz }
September 8, 2025 Score: 0 Rep: 38,206 Quality: Low Completeness: 40%

Solution with two rotates

void swapInPlace(std::string& s, sizet a, sizet nexta, sizet b, sizet nextb) {
    const sizet lenb = nextb - b;
    const sizet lena = nexta - a;
    const sizet lengap = b - nexta;

std::rotate(s.begin() + a, s.begin() + b, s.begin() + next
b);

const auto newastart = s.begin() + a + lenb;

std::rotate(new
astart, newastart + lena, newastart + lena + lengap); }
September 23, 2025 Score: -1 Rep: 32,900 Quality: Medium Completeness: 60%

Why restrict it to plain strings?

#include 
#include 

template void swapinplace(It pa, It pz, It qa, It qz) { // Ppp...Qqqqq or Ppppp...Qqq auto pm = std::swapranges(qa, qz, pa); // Qqqqq.Ppp.. or Qqqpp...Ppp std::rotate(pm, pm < pz ? pz : qa + (pz - pa), qz); // Qqqqq...Ppp or Qqq...Ppppp }

Demo:

#include 
#include 

int main() { std::wstring s{LR"--(That is a "foobar", this here is a "baz")--"}; { auto pa = s.begin() + 11; auto pz = pa + 6; auto qa = s.begin() + 36; auto qz = qa + 3; swap
in_place(pa, pz, qa, qz); // That is a "baz", this here is a "foobar" std::wcout