1

Тема: string можна порівнювати?

я програміст сі, читаю книжку плюсів, написано

string a=" ";
string b;
while(cin>>b)
{
   if (a==b) cout << "Слово співпадає з попереднім" << endl;
   if (a>b) cout << "Останнє слово в алфавітному порядку перед даним" << endl;
   if (a<b) cout << "дане слово в алфавітному порядку перше, останнє за ним" << endl;
   a=b;
}

Як можна порівнювати строчки? Загублюється логіка сі. Як це одна строчка менше іншої? Ну менше скажімо по розміру, тут логіка ще є. Але як може бути меншою символьно? Чи це йде порівняння суми всіх кодів букв?

2 Востаннє редагувалося Fox (27.04.2019 22:14:27)

Re: string можна порівнювати?

Вам потрібно розташовувати слова в алфавітному порядку ?

--------------------------------------------------------------------------
Я перший раз бачу оператор ">", "<" для string, але судячи з коду він робить так:
Маємо два слова "АБВ" і "АББ"
Якщо буква з індексом n в обох слів однакова, то ідемо далі поки не знайдемо різні букви.
Коли знайшли різні букви, то дивимося яка з них стоіть далі в абетці.
Якщо слова різні за довженою, то більше слово буде нижче за абеткою.
--------------------------------------------------------------------------
Можливо я це напридумв і воно просто порівнює довжену стрічок, але якого біса тоді таку штуку не юзають ? Всі порівнюють довжину через .length();

3 Востаннє редагувалося koala (27.04.2019 22:14:23)

Re: string можна порівнювати?

https://uk.wikipedia.org/wiki/Лексикографічний_порядок

А якщо ви з C перейшли, то

string a=...;
string b=...;
if(a<b)...

майже еквівалентно (трохи роботи додається)

char a[]=...;
char b[]=...;
if(strcmp(a,b)<0)...
Подякували: gazx21

4 Востаннє редагувалося wander (27.04.2019 22:23:28)

Re: string можна порівнювати?

Програмісти Сі і С++ це таки трохи різні люди, ви нарешті
оприділіться хто ви, і яку мову хочете вивчати. Питання
ваше надзвичайно просте, як мінімум через те, що ви
або вибрали погану книжку, або почали її читати з середини.
Відкрийте розділ про char’и та перечитайте його, якщо вам
все ще не стало зрозуміло що вони з себе представляють,
то можете загуглити, але я б тоді таки радив змінити книжку.

Якщо коротко char’и порівнюють як цілі числа, бо
такими вони по суті і є. А оператори більше/менше
у std::string роблять те саме лиш з поправкою на
лексографічний порядок.

Подякували: gazx21

5

Re: string можна порівнювати?

я знаю що char-и це коди символів, тобто все в пам'яті має тільки числове значення, побітно 0 і 1. інтерпретатор переводить ці коди відповідно до типу. коди символів переводяться в картинку шрифту, бо символ це по суті картинка, яка відповідає коду. до char можна застосовувати додавання і т.д., але ж не до масиву.
мені б саме визначення string тобто щось наподобі

struct string
{
//...
};

я написав попередньо що я програміст сі, але я мав на увазі що я сі знаю краще, ніж плюси. насправді сі я знаю поганенько

6

Re: string можна порівнювати?

Ну, насправді одне з перших завдань, які слід зробити на C++ після вивчення синтаксису - це написати власний string.
Ви можете перейти в <string> і подивитися, як там описується std::string, але гарантую, що ви там нічого не розберете.
Якщо в двох словах, то std::string - це обгортка char*, яка автоматично виділяє та звільняє пам'ять та має зручні функції для обробки, на кшталт operator + замість strcat.

Подякували: gazx2, leofun012

7

Re: string можна порівнювати?

Дякую, проте мені потрібна повна інформація, щоб логічно розуміти, що відбувається.
Зайшов в хеадери

typedef basic_string<char>    string;
typedef basic_string<wchar_t> wstring;

Виявляється є ще й wstring.
а це не зрозумів

typedef basic_string<char16_t> u16string; 
typedef basic_string<char32_t> u32string; 

а далі - тупик.
юзаю dev-cpp в файлі написано

#include <bits/c++config.h>

я по ньому клікаю ctrl+клік. не відкриває. зайшов провідником в папку bits, такого файлу немає...
зате в папці бітс є файл basic_string.h
а в файлі є клас basic_string, який хоч трохи дає зрозуміти що там.
Цей контент доступний тільки зареєстрованим користувачам.
але мені не дає зрозуміти все одна лише річ. що означають всі ці записи <> в отаких скобках?

8

Re: string можна порівнювати?

Як вам вже сказали std::string - це лише «розумна» обгортка
над char*, а власне basic_string - це деяка «загальна» обгортка,
реалізована на шаблонах, для того, щоб не писати кілька різних
реалізацій для звичайного char i для більш «широких» типів
про них (wchar, char16, char32) дещо можна почитати в сусідній
темі, я там дещо описував
https://replace.org.ua/topic/10730/
Власне оці записи <> це і є шаблони, які дозволяють написати
одну загальну реалізацію для різних типів, а окремі будуть
згенеровані компілятором замість вас, впевнений, що у вашій
книжці про них пише, пошукайте. Якщо цікаво детальніше
про них почитати можете взяти книжку, називається
C++ Templates, за авторством Девіда Вандервуда.

Подякували: gazx21

9

Re: string можна порівнювати?

Я зрозумів по шаблонах. Тобто, якщо написати

template <typename T>
class MyClass
{
   public:
      T a;
      T b;
      T c;
      void sum(){c=a+b};
      void min(){c=a-b};
      void mn(){c=a*b};
      void dila{if (b!=0) c=a/b};
      void dilb{if (a!=0) c=b/a};
};

то якщо написати

MyClass <int> mc;

то це еквівалент

class MyClass
{
   public:
      int a;
      int b;
      int c;
      void sum(){c=a+b};
      void min(){c=a-b};
      void mn(){c=a*b};
      void dila{if (b!=0) c=a/b};
      void dilb{if (a!=0) c=b/a};
};

а якщо

MyClass <double> mc;

то

class MyClass
{
   public:
      double a;
      double b;
      double c;
      void sum(){c=a+b};
      void min(){c=a-b};
      void mn(){c=a*b};
      void dila{if (b!=0) c=a/b};
      void dilb{if (a!=0) c=b/a};
};

і так далі тобто компілятор замінює T на будь-який тип, вказаний

MyClass <тип> mc;

Я правильно зрозумів? Я сказав би  що аналог

#define T int
class MyClass
{
   public:
      T a;
      T b;
      T c;
      void sum(){c=a+b};
      void min(){c=a-b};
      void mn(){c=a*b};
      void dila{if (b!=0) c=a/b};
      void dilb{if (a!=0) c=b/a};
};

але що скаже компілятор, якщо в типі вказати наприклад

MyClass <char*> mc;

?
тобто що попало вказувати не можна?
тобто це дає підстави вважати, що професійно string є не серйозним типом і його використовувати для написання серйозних програм не можна, краще char*?

10 Востаннє редагувалося koala (28.04.2019 07:36:38)

Re: string можна порівнювати?

Певним чином шаблони - аналоги макросів; але гарантовано "чистіші" (зокрема, час життя параметру шаблона обмежений шаблоном, а не продовжує жити далі, як у вас).
Крім того, є правило "substitution failure is not an error" (SFINAE), яке означає, що доки ви не намагатиметеся робити заборонену операцію, все працюватиме:

MyClass <int> mci;
mc.a = 10;
mc.b = 3;
mc.dila();
MyClass <char *> mcpc;
char st[] = "ABC";
mcpc.a = st;
mcpc.b = st;
mcpc.dilb();//і тільки тут станеться помилка, решта коду працює

Можна писати окремі спеціалізації шаблонів для певних типів.
Є ціла бібліотека <type_traits> для виявлення властовостей параметрів у шаблонах.

gazx2 написав:

тобто це дає підстави вважати, що професійно string є не серйозним типом і його використовувати для написання серйозних програм не можна, краще char*?

Ні, це максимум дає підстави вважати, що basic_string може поводитися неочікувано, якщо підставити йому неправильні параметри. string - абсолютно нормальний тип, який використовується в реальних проектах.

Подякували: gazx2, leofun012

11

Re: string можна порівнювати?

Дякую. Трохи прояснилося. Але все ж не зовсім зрозуміло, нащо розробники залишили можливіть редагувати хеадери і залишили клас basic_srting, а не перевели все це в асемблерний код одразу.  Ну якщо вказати неправильні параметри і він буде себе поводити неочікувано. Іще я не розумію а яким чином можна в с++ назначити дію якомусь знаку, + чи -? Для цього є якість команди? Чи як їх назвати незнаю.

12

Re: string можна порівнювати?

Якщо ви вбачаєте забагато можливостей для втручання в код - C++ не ваша мова. C++ якраз відрізняється тим, що майже всі обмеження можна, за бажання, обійти, мова не диктує вам, що робити, це відповідальність програміста.
І прочитайте, будь ласка, якийсь підручник, бо ви зараз ставите питання з синтаксису мови, а писати вам тут підручник безглуздо: якщо ви його не прочитали там, то з чого б ви стали його читати тут? Якщо вас так уже це цікавить, то це зветься "перевантаженням операторів" (operator overloading). Але прочитайте не лише про них, а весь підручник.

Подякували: gazx21

13

Re: string можна порівнювати?

Христос Воскрес!
такий я невіруючий що навіть не написав, в сусідньому розділі KIT написав, то і я згадав, а так би і не згадав що Пасха сьогодні   *SORRY* 
koala, можете мені показати той підручник? а то я вже давно шукаю. по сі толкові (старі радянські) є, по с++ немає.

14 Востаннє редагувалося wander (28.04.2019 11:32:54)

Re: string можна порівнювати?

Ніколи не розумію людей, які беруть якусь книжку по
мові програмування для початківців, відкривають її десь
на середині, читають звідти дві сторінки при цьому нічого
не зрозумівши і потім біжать на форуми з питаннями на
ці теми, раджу вам таки почати читати книжку від самого
початку, навіть, якщо до цього ви вчили Сі, і таки дочитувати
книжку, як мінімум до кінця розділу, якщо щось не зрозуміло
спробуйте перечитати розділ ще раз, поки розуміння не прийде,
зазвичай у книгах для початківців дають більш ніж достатньо
n-их знань для рівня початківця (за умови, що це хороша книга),
звісно після прочитання цієї книги у вас напевне можуть виникати
питання, а як ж воно там працює під капотом і це нормально, бо
у книжках для початківців неможливо розписати все настільки
детально інакше кількість сторінок перевалить в кілька тисяч.
Тобто, якщо вам щось не зрозуміло, то можливо це варто трохи
відкласти на потім і згодом почитати окремі книжки де більш
детально описана робота мови, або ж звернутися до стандарту
чи загуглити, я впевнений, що на більшість ваших питань вже
давно є відповіді на stackoverflow :)
А от якщо не має тоді і можна тут задати питання))

Старі радянські книжки це поганий варіант, я вам отут скину
пару толкових книг по С++
https://www.amazon.com/Primer-5th-Stanl … 0321714113
amazon.com/C-Programming-Language-4th/dp/0321563840

Подякували: gazx21

15

Re: string можна порівнювати?

Гляньте тут: https://replace.org.ua/topic/4000/

16

Re: string можна порівнювати?

Ой і ще чуть не забув дуже круту книгу, яка водночас є невеликою,
але тим не менш містить багато прикладів, та задач для розв'язування,
звісно вона може показатися трохи складною адже вона містить щось
близько 350 сторінок і тут зрозуміло, що авторам прийшлося піти на
поступки та від чогось відмовити або щось урізати (власне звідти і назва
Accelerated C++), проте це не робить цю книжку поганою.
Я вважаю це одна з найкращих книг для вступу в роботу з С++,
особливо якщо ви з Сі і читали наприклад K&R.
https://www.amazon.com/Accelerated-C-Pr … amp;sr=1-1

Подякували: gazx21

17

Re: string можна порівнювати?

adziri, Дякую!
koala, ох же мене насмішили!  :D в тій темі що ви показали, посилання лиш на одну книжку. Без посилань 5 книг. "Гляньте". Глянув би, аби було на що. От візьміть всі посилання у всіх темах на книжки як от в цій темі запостив adziri, створіть html сторінку і туди по порядку запостіть. Так роблять всі форуми. Навіщо тема з купою сміття і не потрібних обговорень і лише з 1 посиланням на книгу? я спочатку думав що ви щось нормальне дали