Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Перегрузил operator, () для std::string::iterator


Автор: andrew_121 18.6.2009, 16:46
Дарова!
Устал инициализировать строки из итераторов. Написал вот что:
Код


#include <string>
#include <vector>
#include <iostream>

std::string operator, (std::string::const_iterator beg, std::string::const_iterator end) {
    std::string result;
    result.resize(end-beg);
    std::copy(beg, end, result.begin());
    return result;
}

int main(int argc, const char** argv) {

    std::string src("abcdef");

    std::string dst = (src.begin(), src.end());

    std::cout << dst << std::endl;
    
    return 0;
}



Автор: azesmcar 18.6.2009, 17:01
напрашивается вопрос..а нафига?

чем этот вариант лучше
Код

std::string dst = (src.begin(), src.end());

этого?
Код

std::string dst(src.begin(), src.end());


Автор: Fazil6 18.6.2009, 17:03
невижу никаких преимуществ. Чем твое лучше чем это
Код

    std::string dst3(src.begin(), src.end());

???

Автор: andrew_121 18.6.2009, 17:11
azesmcar, 
Fazil6, Формой записи)

Автор: azesmcar 18.6.2009, 17:15
andrew_121

А вообще - плохо.

Автор: Cheloveck 18.6.2009, 17:16
эмм...

Код

    string s("qwerty");
    string q; // Пусть эта строка пустая или где-то использовалась до этого...
    q = s.c_str();

не катит?

Автор: azesmcar 18.6.2009, 17:17
Цитата(Cheloveck @  18.6.2009,  17:16 Найти цитируемый пост)
q = s.c_str();

а зачем тут c_str нужен? smile 

Автор: Cheloveck 18.6.2009, 17:21
Уговорили

Код

    string s("qwerty");
    string q;
    q = &(*(s.begin()));


Добавлено через 37 секунд
Если очень хочется итераторы юзать

Автор: JackYF 18.6.2009, 17:24
andrew_121, рекомендую строковые алгоритмы в Boost.

Автор: mes 18.6.2009, 17:24
Цитата(azesmcar @  18.6.2009,  16:15 Найти цитируемый пост)
andrew_121

А вообще - плохо.

того же мнения.

Добавлено через 1 минуту и 30 секунд
Цитата(Cheloveck @  18.6.2009,  16:21 Найти цитируемый пост)
Уговорили

Цитата(Cheloveck @  18.6.2009,  16:21 Найти цитируемый пост)
q = &(*(s.begin()));

 smile  smile  smile

Cheloveck, думаю не стоит подаваться на уговоры. smile

Автор: azesmcar 18.6.2009, 17:31
Цитата(Cheloveck @  18.6.2009,  17:21 Найти цитируемый пост)
Если очень хочется итераторы юзать 

а по старинке сейчас не модно да? smile 
Код

string s("qwerty");
string q;
q = s;


Добавлено через 4 минуты и 29 секунд
вообще такая перегрузка данного операторе неприемлема на мой взгляд. Если уж перегружать, то он хотя бы должен вести себя натурально.
а что получится вот в этом случае?
Код

std::string::const_iterator it = (src.begin(), src.end()); //ошибка компиляции

несмотря на то что этот код должен был работать, он не работает, потому что оператор , возвращяет std::string а не правый аргумент как ему приписывает стандарт.

Автор: andrew_121 18.6.2009, 17:47
azesmcar, Согласен!
Но прикольно получилось smile 
Видал я однажды перегрузку этого же оператора для строки(не STL). Долго я тупил, пока въехал что это перегруженный оператор, но там он выполнял конкатенацию smile  Вот это было нечто!
Хотелось тому прогеру пальчики в двери прижать.

Ладно. Всем спасибо! Все же думаю, что пользовать можно...

Добавлено через 1 минуту и 56 секунд
Цитата(azesmcar @  18.6.2009,  17:31 Найти цитируемый пост)
несмотря на то что этот код должен был работать, он не работает, потому что оператор , возвращяет std::string а не правый аргумент как ему приписывает стандарт. 

Если он будет возвращать итератор, какой смысл в перегрузке?

Автор: mes 18.6.2009, 17:53
Цитата(andrew_121 @  18.6.2009,  16:47 Найти цитируемый пост)
Ладно. Всем спасибо! Все же думаю, что пользовать можно...

Приведите, плиз, вариант написаный в обычном стиле, для которого ваш способ дает преимущество.
А то я чего то не пойму на чем Вы экономите. smile

Автор: andrew_121 18.6.2009, 18:07
mes
Код


#include <string>
#include <algorithm>
#include <iostream>

std::string operator, (std::string::const_iterator beg, std::string::const_iterator end) {
    std::string result;
    result.resize(end-beg);
    std::copy(beg, end, result.begin());
    return result;
}

int main(int argc, const char** argv) {

    std::string src("abcdef");
    std::string::iterator it1 = std::find(src.begin(), src.end(), 'c');
    std::string::iterator it2 = std::find(src.begin(), src.end(), 'e');

    std::string dst = (it1, it2);

    std::cout << dst << std::endl;
    
    return 0;
}


Автор: mes 18.6.2009, 18:39
Цитата(mes @  18.6.2009,  16:53 Найти цитируемый пост)
Приведите, плиз, вариант ... для которого ваш способ дает преимущество.


Цитата(andrew_121 @  18.6.2009,  17:07 Найти цитируемый пост)
    std::string::iterator it1 = std::find(src.begin(), src.end(), 'c');
    std::string::iterator it2 = std::find(src.begin(), src.end(), 'e');
    std::string dst = (it1, it2)


 smile, ну и где преимущество ? 

Код

    std::string::iterator it1 = std::find(src.begin(), src.end(), 'c');
    std::string::iterator it2 = std::find(src.begin(), src.end(), 'e');

    std::string dst (it1, it2);

Автор: andrew_121 18.6.2009, 18:47
mes, Не злитесь smile 
Мне кажется так удобней.
Дело вкуса.

Автор: mes 18.6.2009, 18:51
Цитата(andrew_121 @  18.6.2009,  17:47 Найти цитируемый пост)
Не злитесь smile 

так я и не злюсь, я просто действительно не пойму, где  Вы отыскали удобство, и что в нем хорошего, раз согласились на такое ухищрение.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)