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

Сравнить два int числа расположенных в char* строке - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.75
rn3kk
0 / 0 / 0
Регистрация: 15.07.2013
Сообщений: 13
15.07.2013, 13:38     Сравнить два int числа расположенных в char* строке #1
Всем првиет.
Имею проблему связанную с быстродействием.
Нужно сравнить 2 строки на больше/меньше/равно.
Каждый символ строки - число. строка строго 7 символов, т.е. 7 чисел.
При приведении к int через функцию atoi() идет большая задержка (т.к. мильен итераций цикла, где находится данная проверка). Посоветуйте алгоритм сравнения.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2013, 13:38     Сравнить два int числа расположенных в char* строке
Посмотрите здесь:

Вытащить числа в Int из Char C++
Конвертация числа в строку (int to char) C++
C++ Как превести из char* в int и наоборот из int в char*?
сложить столбиком два числа char C++
записать по-битого один short int в два char C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 13:45     Сравнить два int числа расположенных в char* строке #2
Как на счет функции strcmp ( http://www.cplusplus.com/reference/c...cmp/?kw=strcmp ) !?
Valentina
66 / 66 / 3
Регистрация: 13.05.2012
Сообщений: 130
15.07.2013, 13:46     Сравнить два int числа расположенных в char* строке #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>
using namespace std;
 
int main()
{
    setlocale(LC_CTYPE,"rus");
     char* a="1234567";
     char* b="0123456";
    for(int i=0;i<strlen(a);i++)
    {if(a[i]<b[i])
    {cout<<"<";break;}
    if(a[i]>b[i])
    {cout<<">";break;}
    if(a[i]==b[i])
    {cout<<"==";break;}}
 
    system("pause");
    return 0;
}
rn3kk
0 / 0 / 0
Регистрация: 15.07.2013
Сообщений: 13
15.07.2013, 13:46  [ТС]     Сравнить два int числа расположенных в char* строке #4
не помогает. долго. нужно посимвольно сравнить и принять решения. быстрее if() ничего не работает. Вопрос в алгоритме.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
15.07.2013, 13:47     Сравнить два int числа расположенных в char* строке #5
1) Ручками.
2) Получать коды символов и сравнивать их. Не знаю на сколько это будет быстрее, но кажется мне.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 13:47     Сравнить два int числа расположенных в char* строке #6
Цитата Сообщение от rn3kk Посмотреть сообщение
не помогает. долго.
Там всего один цикл. Насколько ж быстро тебе надо?
rn3kk
0 / 0 / 0
Регистрация: 15.07.2013
Сообщений: 13
15.07.2013, 13:58  [ТС]     Сравнить два int числа расположенных в char* строке #7
у меня данная проверка внутри 3-х циклов проходов по контенерам. конечная точка сравнения так сказать. анализирую код предложенный Valentina,

Добавлено через 1 минуту
символы не нужно приводить к инт. при сравнении все работает нормально. Если нужно получить число, можно отнять 0x30.

Добавлено через 8 минут
Цитата Сообщение от Valentina Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>
using namespace std;
 
int main()
{
    setlocale(LC_CTYPE,"rus");
     char* a="1234567";
     char* b="0123456";
    for(int i=0;i<strlen(a);i++)
    {if(a[i]<b[i])
    {cout<<"<";break;}
    if(a[i]>b[i])
    {cout<<">";break;}
    if(a[i]==b[i])
    {cout<<"==";break;}}
 
    system("pause");
    return 0;
}
но ведь тут просто сравниваем один единственный символ и выходим из цикла.
Мне же необходимо воспринимать все символы строки как одно число.
т.е. char* a="1234567";
это эквивалентно целому числу int c=1234567; как то так.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 14:06     Сравнить два int числа расположенных в char* строке #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main()
{
    char *a = "100";
    char *b = "200";
 
    int c = 0;
    while ( *a ) c += *a++ - *b++;
 
    printf( "%d\n", c );
}
rn3kk
0 / 0 / 0
Регистрация: 15.07.2013
Сообщений: 13
15.07.2013, 14:14  [ТС]     Сравнить два int числа расположенных в char* строке #9
lazybiz, необычно. сейчас попробуем.

Добавлено через 2 минуты
lazybiz, у твоего метода есть один недостаток. мы пройдем по всем символам. т.е. если числа 100 и 110 то уже на 2-й итерации можно выйти из цикла.

Добавлено через 2 минуты
может имеет смысл в данном случае ассемблерная вставка?
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 14:22     Сравнить два int числа расположенных в char* строке #10
Тебе прям не угодишь.. ты не беременный?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int main()
{
    char *a = "1234567";
    char *b = "1235567";
 
    int c = 0;
    while ( *a ) {
        c += *a++ - *b++;
        if ( c ) break;
    }
 
    printf( "%d\n", c );
}
rn3kk
0 / 0 / 0
Регистрация: 15.07.2013
Сообщений: 13
15.07.2013, 14:30  [ТС]     Сравнить два int числа расположенных в char* строке #11
lazybiz, =) не русгайся. спасибо. еще не попробоавл твой метод спасибо.

Добавлено через 6 минут
эх.. спасибо друзья. пришлось отказаться от этой затеи. Банальное копирование
Кликните здесь для просмотра всего текста
const char *begin_tmp=(*itRg)->getBegin()

при мегабольшом кол-ве итераций привело к увеличению времени выполнения на 3 минуты. Всем спасибо.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 14:33     Сравнить два int числа расположенных в char* строке #12
Я не понял, ты решил свою проблему?
Если нет то может код покажешь с входящими данными?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.07.2013, 14:36     Сравнить два int числа расположенных в char* строке #13
А чем рукописный вариант будет быстрее предложенного в начале strcmp? Суть ведь та же.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 14:37     Сравнить два int числа расположенных в char* строке #14
Ну может у него компилятор не умеет оптимизировать и не знает что такое inline-функции..
rn3kk
0 / 0 / 0
Регистрация: 15.07.2013
Сообщений: 13
15.07.2013, 14:40  [ТС]     Сравнить два int числа расположенных в char* строке #15
пришлось отказаться целиком от данного кода. эта штука, что я делал, нужна для определения инфы о номере телефона по деф кодам от россвязи. Ну и вызывается код для каждого номера, т.е. 200-300 тыс раз.
До этого все было сделано на диком кол-ве if()else. буду писать генератор функции на if() класть его в cpp и потом компилить.. это ужасно....

Добавлено через 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
bool PhoneInfo::GetPhoneInfo( char* Phone,  int* operatorId, int* areaId,  int* regionId){
 
  vector<OperatorInfo*>::iterator itOi;
  vector<AreaInfo*>::iterator itAi;
  vector<Range*>::iterator itRg;
  int i =0;
  for(itOi = oiList->begin(); itOi != oiList->end();  ++itOi ){
    vector<AreaInfo*>* aiList =  (*itOi)->getAreaInfoList();
    for(itAi = aiList->begin(); itAi != aiList->end(); ++itAi){
      vector<Range*>* rangeList = (*itAi)->getRangeList();
      for(itRg = rangeList->begin(); itRg != rangeList->end();  ++itRg){
         const char *def_tmp = (*itRg)->getDef();
         if( Phone[0] !=  def_tmp[0]
             || Phone[1] !=  def_tmp[1]
             || Phone[2] !=  def_tmp[2]) continue;
 
 
         const char *begin_tmp=(*itRg)->getBegin(), *end_tmp=(*itRg)->getEnd();
>>>>>>>>>>>тут код по сравнению строк <<<<<<<<
         *operatorId = (*itOi)->getOpId();
         *areaId = (*itAi)->getAreaId();
         *regionId = (*itAi)->getMacroAreaId();
         return true;   */
      }
    }
  }
 
  *operatorId = 0;
  *areaId = 0;
  *regionId = 0;
  return false;
}
от такие дела ребята.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 14:42     Сравнить два int числа расположенных в char* строке #16
Да, это действительно ужасно...
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
15.07.2013, 17:40     Сравнить два int числа расположенных в char* строке #17
Цитата Сообщение от rn3kk Посмотреть сообщение
7 чисел.
может быть цифр?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.07.2013, 17:49     Сравнить два int числа расположенных в char* строке #18
Цитата Сообщение от Dani Посмотреть сообщение
может быть цифр?
чисел (но от 0 до 9)
Dani
15.07.2013, 17:58
  #19

Не по теме:

Tulosba, и сравнить надо 14 чисел тогда

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2013, 18:13     Сравнить два int числа расположенных в char* строке
Еще ссылки по теме:

Сравнить два числа, вывести большее C++
C++ Длинная арифметика. Сравнить два числа
C++ Как сравнить два указателя типа char?

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.07.2013, 18:13     Сравнить два int числа расположенных в char* строке #20
Цитата Сообщение от Dani Посмотреть сообщение
и сравнить надо 14 чисел тогда
7 пар чисел, да.
Yandex
Объявления
15.07.2013, 18:13     Сравнить два int числа расположенных в char* строке
Ответ Создать тему
Опции темы

Текущее время: 02:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru