Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегрузил operator, () для std::string::iterator, Это хорошо? Плохо? Почему? 
V
    Опции темы
andrew_121
Дата 18.6.2009, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



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


#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;
}





--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
azesmcar
Дата 18.6.2009, 17:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



напрашивается вопрос..а нафига?

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

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

этого?
Код

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


PM   Вверх
Fazil6
Дата 18.6.2009, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



невижу никаких преимуществ. Чем твое лучше чем это
Код

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

???
PM MAIL   Вверх
andrew_121
Дата 18.6.2009, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



azesmcar, 
Fazil6, Формой записи)


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
azesmcar
Дата 18.6.2009, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



andrew_121

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


Это сообщение отредактировал(а) azesmcar - 18.6.2009, 17:16
PM   Вверх
Cheloveck
Дата 18.6.2009, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32



эмм...

Код

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

не катит?


--------------------
user posted image
PM Jabber   Вверх
azesmcar
Дата 18.6.2009, 17:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



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

а зачем тут c_str нужен? smile 
PM   Вверх
Cheloveck
Дата 18.6.2009, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32



Уговорили

Код

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


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


--------------------
user posted image
PM Jabber   Вверх
JackYF
Дата 18.6.2009, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



andrew_121, рекомендую строковые алгоритмы в Boost.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
mes
Дата 18.6.2009, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(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


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 18.6.2009, 17:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(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 а не правый аргумент как ему приписывает стандарт.
PM   Вверх
andrew_121
Дата 18.6.2009, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



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

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

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

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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
mes
Дата 18.6.2009, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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



--------------------
PM MAIL WWW   Вверх
andrew_121
Дата 18.6.2009, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



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;
}




--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
mes
Дата 18.6.2009, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(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);



--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0604 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.