Я перегрузил operator* для класса std::string, но в этом случае:

std::string operator*(std::string a, unsigned b) //bad
{
    unsigned old_length = a.length();
    a.resize(a.length()*b);
    for(unsigned i = old_length ;i<a.length()*b; i++)
        a[i]=a[i%old_length];
    return a;
}

Программа вылетает с ошибкой:

*** Ошибка в `./program ': free (): недопустимый следующий размер (быстро): 0x0000000000cd20b0 *** Прервано

Если так перегрузить - ошибок нет:

std::string operator*(std::string a, unsigned b)
{
    unsigned old_length = a.length();
    std::string a2 = a;
    a2.resize(a.length()*b);
    for(unsigned i = 0 ;i<a.length()*b; i++)
        a2[i]=a[i%old_length];
    return a2;
}

Так в чем же проблема? Есть ли способ не создавать новую строку a2? Потребляет дополнительную память.

#include <iostream>
#include <string>

std::string operator*(unsigned b, std::string a)
{
    return operator*(a, b);
}

int main(int argc, char **argv)
{
    std::string a = "abcdef "; // if string contains more than 4 symbols - free error for the first case
    std::string aaaa = 4*a;

    std::cout << a << "\n" 
              << aaaa << "\n" 
              << std::endl;
    return 0;
}
1
yanpas 3 Янв 2016 в 22:18

2 ответа

Лучший ответ

Вы не можете выполнять итерацию до тех пор, пока снова не a.length() * b (потому что это эквивалентно old_length * b * b после изменения размера).

Условие должно быть либо i < a.length(), либо i < old_length * b.

Но почему бы не использовать некоторые функции std::string?

std::string operator*(std::string a, unsigned b)
{
    a.reserve(a.length() * b);

    for(unsigned i = 1 ; i <= b; i++)
        a += a.substr(0, a.length() / b);

    return a;
}

Мы также эффективно удалили переменную old_length (не так эффективно с точки зрения производительности, см. Лучший подход в комментарии ниже).

5
LogicStuff 4 Янв 2016 в 01:20

Как только вы сделаете a.resize(a.length()*b);

a.length() изменилось.

Ваш цикл должен быть чем

for(unsigned i = old_length ;i<a.length(); i++)
3
Jarod42 3 Янв 2016 в 19:24