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

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

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

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

24.08.2012, 17:47. Просмотров 6175. Ответов 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 (C++):

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri - C++
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка error: cannot convert 'std::string {aka...

STL std::set, std::pair, std::make_pair - C++
Я не знаю как описать тему в двух словах, поэтому не обращайте внимание на название темы. Собственно перейдем к нашим баранам: есть...

запрошено преобразование от ‘const std::string*’ к нескалярному типу ‘std::string’ - C++
private: std::string firstName; }; std::string ClientData::getFirstName() const{ return firstName; } Дает в итоге...

Стандартный поток и STL (std::copy to std::cout) - C++
#include &lt;iostream&gt; #include &lt;sstream&gt; #include &lt;algorithm&gt; #include &lt;functional&gt; #include &lt;string&gt; using namespace std; ...

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

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами - C++
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
27.08.2012, 19:25 #31
~OhMyGodSoLong~, Почему в варианте для stl-нутых используется for_each? Алгоритмы надо под задачу выбирать, а не всегда for_each пользоваться.

http://liveworkspace.org/code/6d41ab...61b3309317c755

А для утят вариант... Опять же алгоритмы берутся не по делу. Если уж С++11 тогда так.

http://liveworkspace.org/code/1d9bc2...d78ebdb1018315
vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
05.09.2012, 05:20  [ТС] #32
Ещё вопрос
как с алгоритмом STL заменить найденные слова на другое слово в строке.
голова к ночью совсем не работает.
C++
1
2
3
4
5
6
7
8
9
10
string str = "Hell0 wOrd!";
string replaceable = "0O";
 
// нужно это решить STL алгоритмом
for(size_t i = 0; i < str.size(); ++i)
    for(size_t j = 0; j < replaceable.size(); ++j)
        if(str[i] = replaceable[j])
            str[i] = "o";
 
// str будет возвращать "Hello word"
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
05.09.2012, 07:14 #33
vendeme, Распарсить предложение на слова - заменить вхождения конкретного слова. boost::split + std::replace.
vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
05.09.2012, 07:33  [ТС] #34
Цитата Сообщение от vendeme Посмотреть сообщение
с алгоритмом STL
Цитата Сообщение от ForEveR Посмотреть сообщение
boost::split
невнимательность, нет?
ну можно и с strtok, но всё равно мне кажется поиск с разделением на слова не лучшая идея.
По буквенный перебор с циклом мне кажется более быстрый вариант, хоть и громоздкий.
Или нет?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
05.09.2012, 08:46 #35
vendeme, Нет, не невнимательность. boost::split написать самому довольно просто, элементарно пишется через std::stringstream. А вам производительность критична или что?

Добавлено через 12 минут
А что в данном случае значит "слова"? Так-то, если вхождения просто - достаточно std::string::find + std::string::replace.
vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
05.09.2012, 20:30  [ТС] #36
Цитата Сообщение от ForEveR Посмотреть сообщение
А вам производительность критична или что?
производительность ооочень, очень критична.

А какой самый быстрый метод поиска если дано:
контейнер map[char, string], размер ~50.
контейнер string, размер < 255
нужно найти в string символы map->second и заменить их символом map->first

Ну или другой контейнер в качестве двумерного массива.

Добавлено через 11 часов 12 минут
bump!
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
05.09.2012, 21:29 #37
Цитата Сообщение от vendeme Посмотреть сообщение
производительность ооочень, очень критична.
Ну раз только единичные символы, то так:
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
#include <iostream>
#include <map>
#include <string>
#include <climits>
 
int main()
{
  std::map<std::string, char> subst = {
    {"0123456789", 'N'},
    {"abcdefABCDEF", 'X'},
    {".!,:;-\"'?", 'P'}
  };
  
  // разворачиваем map в одномерный массив
  char subst_[CHAR_MAX] = {0};
  for (auto couple : subst) {
    for (char c : couple.first) {
      subst_[static_cast<size_t>(c)] = couple.second;
    }
  }
  
  // делаем замену по subst_
  std::string src = "ab8ca4ic!;';1!1asjdkabx9be1p7bai";
  std::cout << src << std::endl;
  for (auto c = src.begin(); c != src.end(); ++c) {
    if (subst_[static_cast<size_t>(*c)] != '\0') {
      *c = subst_[static_cast<size_t>(*c)];
    }
  }
  std::cout << src << std::endl;
}
vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
05.09.2012, 21:39  [ТС] #38
Цитата Сообщение от ~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
#include <iostream>
#include <map>
#include <string>
#include <climits>
 
int main()
{
  std::map<std::string, char> subst = {
    {"0123456789", 'N'},
    {"abcdefABCDEF", 'X'},
    {".!,:;-\"'?", 'P'}
  };
  
  // разворачиваем map в одномерный массив
  char subst_[CHAR_MAX] = {0};
  for (auto couple : subst) {
    for (char c : couple.first) {
      subst_[static_cast<size_t>(c)] = couple.second;
    }
  }
  
  // делаем замену по subst_
  std::string src = "ab8ca4ic!;';1!1asjdkabx9be1p7bai";
  std::cout << src << std::endl;
  for (auto c = src.begin(); c != src.end(); ++c) {
    if (subst_[static_cast<size_t>(*c)] != '\0') {
      *c = subst_[static_cast<size_t>(*c)];
    }
  }
  std::cout << src << std::endl;
}
1) Среда разработки разная, по этому, C++11 не вариант. Переделайте пожалуйста на старый стандарт.
2) Почему ключ string а не char?
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
05.09.2012, 21:53 #39
Цитата Сообщение от vendeme Посмотреть сообщение
1) Среда разработки разная, по этому, C++11 не вариант. Переделайте пожалуйста на старый стандарт.
2) Почему ключ string а не char?
1)
тыц
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
#include <iostream>
#include <map>
#include <string>
#include <climits>
 
int main()
{
  std::map<std::string, char> subst;
  subst["0123456789"] = 'N';
  subst["abcdefABCDEF"] = 'X';
  subst[".!,:;-\"'?"] = 'P';
  
  // разворачиваем map в одномерный массив
  char subst_[CHAR_MAX] = {0};
  for (std::map<std::string, char>::const_iterator couple = subst.begin();
       couple != subst.end();
       ++couple)
  {
    for (std::string::const_iterator c = (*couple).first.begin();
         c != (*couple).first.end();
         ++c)
    {
      subst_[static_cast<size_t>(*c)] = (*couple).second;
    }
  }
  
  // делаем замену по subst_
  std::string src = "ab8ca4ic!;';1!1asjdkabx9be1p7bai";
  std::cout << src << std::endl;
  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)];
    }
  }
  std::cout << src << std::endl;
}

2) Потому что это логично :\ Ключ — то, по чему производится поиск. Для замены символов на один символ надо же искать один из символов, а не целевой символ. Благо, варианту с разворотом в одномерный массив по барабану, что там ключ.
vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
05.09.2012, 22:04  [ТС] #40
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
2) Потому что это логично :\ Ключ — то, по чему производится поиск. Для замены символов на один символ надо же искать один из символов, а не целевой символ. Благо, варианту с разворотом в одномерный массив по барабану, что там ключ.
Разве?

C++
1
2
3
4
map<char, string> maps;
maps['a'] = "A";
map<char, string>::iterator it = maps.find('a');
cout << boolalpha << (it != maps.end()) << endl;
Вот здесь я получаю по ключу 'a'. Разве не так логично?
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
05.09.2012, 22:06 #41
Ну, это относительно: зависит от того, что искать.
vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
06.09.2012, 02:13  [ТС] #42
~OhMyGodSoLong~, да, ваш вариант поиска быстрее чем простой перебор циклами аж в ~9.2 раза
vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
08.09.2012, 15:45  [ТС] #43
~OhMyGodSoLong~, получаю крэш в 19 строке, если в map есть кириллические символы. Можете помочь? Скажу прямо - думать не хочу.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
08.09.2012, 15:53 #44
Не знаю. Может, потому что кириллица конвертится в юникод, а он в wchar_t или что там, и, соответственно всё ломается, так как ожидается char.
vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
08.09.2012, 17:14  [ТС] #45
~OhMyGodSoLong~, предлагаете использовать wstring и wchar_t?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2012, 17:14
Привет! Вот еще темы с ответами:

Реализация класса MyString. Стандартная библиотека, std::string, std::vector - C++
как добавить реализацию конкатенации строк через перегрузку оператора &quot;+=&quot; в классе MyString и почему ошибка выдается???#include...

Операция std::cout для Объекта типа std::string - C++
Кто детально объяснит почему не выводит ? Дает вот так &quot;Отсутствует оператор &quot;&lt;&lt;&quot;, соответствующий этим операндам&quot; void...

Передача функции указатель на элемент std::vector<std::string> - C++
Доброй ночи тем, кому не спится (или живет в другом часовом поясе:p)! Есть функция, требующая в качестве параметра указатель на...

Как правильно перевести std::wstring в std::string ? - C++
Собственно как? :)


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.09.2012, 17:14
Ответ Создать тему
Опции темы

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