Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 48, средняя оценка - 4.90
vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
#1

[STL] Работа со std::string - C++

24.08.2012, 17:47. Просмотров 6072. Ответов 52
Метки нет (Все метки)

Привет, форум.

Подскажите, как можно грамотно скопировать "слово" из строки, с указанием начала и конца позиций.
Например:
C++
1
2
string str = "My name is Vendetta";
string str name;
нужно грамотно, методом STL, скопировать буквы с 12 по 19. То-есть, слово Vendetta присвоить к name.
Заранее спасибо, может чуть позже ещё будут вопросы на эту тему.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2012, 17:47     [STL] Работа со std::string
Посмотрите здесь:

Работа с классом std::string - C++
Доброго времени суток! Помогите, пожалуйста, с задачей! Никак решить не могу!=( Дан обычный текст на латинице в строке std::string....

Std::move stl-алгоритм - C++
здравствуйте, есть такой код: std::string his = "what the work ?"; std::istringstream isg(his); ...

STL и string - C++
начал тут 1 задачу на форуме решать в text1 какой-то текст, мы ищем в нем слова str и после них вставляем слова str2 вообщем я не...

Размышления о string из STL - C++
Класс string из шаблона STL замечательная вещь! Но вчера он меня чуть не убил... #include <string> using namespace std ... string a...

Undefined symbol string (STL) - C++
подключаю следующие библиотеки #include <iostream.h> #include <vector.h> #include <string.h> using namespace std; void...

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

std:string - C++
1. Поддерживает ли этот класс сравнение целиком строк? Каков синтаксис сравнения строк? 2. Поддерживает ли этот класс конкатенацию? Каков...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
05.09.2012, 22:06     [STL] Работа со std::string #41
Ну, это относительно: зависит от того, что искать.
vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
06.09.2012, 02:13  [ТС]     [STL] Работа со std::string #42
~OhMyGodSoLong~, да, ваш вариант поиска быстрее чем простой перебор циклами аж в ~9.2 раза
vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
08.09.2012, 15:45  [ТС]     [STL] Работа со std::string #43
~OhMyGodSoLong~, получаю крэш в 19 строке, если в map есть кириллические символы. Можете помочь? Скажу прямо - думать не хочу.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
08.09.2012, 15:53     [STL] Работа со std::string #44
Не знаю. Может, потому что кириллица конвертится в юникод, а он в wchar_t или что там, и, соответственно всё ломается, так как ожидается char.
vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
08.09.2012, 17:14  [ТС]     [STL] Работа со std::string #45
~OhMyGodSoLong~, предлагаете использовать wstring и wchar_t?
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
08.09.2012, 17:16     [STL] Работа со std::string #46
Возможно. Я ж не знаю, как у вас там кириллица представляется.
vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
08.09.2012, 19:36  [ТС]     [STL] Работа со std::string #47
~OhMyGodSoLong~, да, с whar_t работает, из-за одной функций не хотелось бы менять данные контейнера. Сейчас покажу анализ кода.
Если будет время, попробуйте переписать вашу функцию.

Добавлено через 1 час 25 минут
~OhMyGodSoLong~,
Не получается дебажить. В дебаге программа работает, в релизе нет. И то не всегда и не как надо.
Вот сами посмотрите:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
std::map<char, string> subst;
 
void Convert(std::string& src)
{
    // разворачиваем map в одномерный массив
    char subst_[CHAR_MAX] = {0};
    for (std::map<char, string>::const_iterator couple = subst.begin();
        couple != subst.end();
        ++couple)
    {
        for (std::string::const_iterator c = (*couple).second.begin();
            c != (*couple).second.end();
            ++c)
        {
            subst_[static_cast<size_t>(*c)] = (*couple).first;
        }
    }
 
    // for debug
    std::string::iterator firstChar =  src.begin();
 
    // делаем замену по subst_
    for (std::string::iterator c = src.begin();
        c != src.end();
        ++c)
    {
        if (subst_[static_cast<size_t>(*c)] != '\0') {
            *c = subst_[static_cast<size_t>(*c)];
        }
    }
}
int main()
{
    setlocale (LC_ALL,"");
 
    subst['N'] = "0123456789";
    subst['X'] = "абвгдАБВГД";
    subst['P'] = ".!,:;-\"'?";
 
    std::string src = "1 я помню 2 чудное ; мгновенье, 4 передо :: мной 6 явилась ты";
 
    Convert(src);
    std::cout << src << std::endl;
    system("pause");
    return 0;
}
понял только что в итоге std::string::iterator c получает ячейку с нулевого массива subst_
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
08.09.2012, 20:21     [STL] Работа со std::string #48
Ну, смотрите, string — это сокращение для basic_string<char>. wstring — для basic_string<wchar_t>. Переделайте это на шаблонный вид, заменив все string на basic_string<T>, а char на T. И CHAR_MAX тогда надо заменить на std::numeric_limits<T>::max().
vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
08.09.2012, 20:30  [ТС]     [STL] Работа со std::string #49
~OhMyGodSoLong~, >>из-за одной функций не хотелось бы менять данные контейнера.
Можно же всё таки как то решить, чтобы было так же быстро, но не прикасаясь к ANSI
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
08.09.2012, 21:05     [STL] Работа со std::string #50
Использовать везде wchar_t и wstring? Их ведь никак не скрестить с char.
vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
08.09.2012, 21:30  [ТС]     [STL] Работа со std::string #51
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Использовать везде wchar_t и wstring? Их ведь никак не скрестить с char.
короче, я наверное вас конкретно задолбал, мне просто нужна рабочая функция:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void Convert(std::string& src)
{
    // разворачиваем map в одномерный массив
    char subst_[CHAR_MAX] = {0};
    for (std::map<char, string>::const_iterator couple = subst.begin();
        couple != subst.end();
        ++couple)
    {
        for (std::string::const_iterator c = (*couple).second.begin();
            c != (*couple).second.end();
            ++c)
        {
            subst_[static_cast<size_t>(*c)] = (*couple).first;
        }
    }
 
    // делаем замену по subst_
    for (std::string::iterator c = src.begin();
        c != src.end();
        ++c)
    {
        if (subst_[static_cast<size_t>(*c)] != '\0') {
            *c = subst_[static_cast<size_t>(*c)];
        }
    }
}
не меняя типы контейнера и передаваемого аргумента . Ну и чтобы быстренько работала
Благодарю заранее
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
08.09.2012, 21:32     [STL] Работа со std::string #52
vendeme, Напишите кодировщик. Перевод из std::string в std::wstring и обратно. Это довольно не просто и делать вам это подозреваю никто не будет. Можете бустом воспользоваться, можете любой другой готовой библиотекой.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2012, 22:01     [STL] Работа со std::string
Еще ссылки по теме:

Std::string - C++
никак не пойму чем отличаются методы append и assign у std::string?

std::string - C++
Здравствуйте! У меня есть std::vector&lt;std::string&gt; Подскажите пожалуйста как быстро и красиво можно перевести i-тый элемент вектора в...

Использование контейнера string из библиотеки STL - C++
Дан массив слов. Сформировать новое слово из символов слов массива, стоящих после последнего символа ‘*’ в слове. Сформировать предложение...

Еще одно размышление о string из STL - C++
Если строки в STL по стандарту могут совместно использовать дин и тот же участок памяти (а это именно следуя из стандарта), тогда следующие...

std::string в char* - C++
Можно ли привести std::string к указателю на нуль-терминальную строку? Как?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
08.09.2012, 22:01  [ТС]     [STL] Работа со std::string #53
ForEveR, ну велосипед изобретён уже Просто хотел не ввязываться в тип ANSI
А вы не можете ответить, почему в Debug режиме работает, а в Realise крэшит? IDE VS9.0
Yandex
Объявления
08.09.2012, 22:01     [STL] Работа со std::string
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru