Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.75
rn3kk
0 / 0 / 0
Регистрация: 15.07.2013
Сообщений: 13
#1

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

15.07.2013, 13:38. Просмотров 2728. Ответов 21
Метки нет (Все метки)

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

Как сравнить два char string - C++
подскажите сделал задачу которая проверит является ли данная строка палиндромом вот код #include <iostream> #include <cstring> ...

Как сравнить два указателя типа char? - C++
char *p1; p1 = new char; p1 = "qwert"; char *p2; p2 = new char; p2 = "zz"; if(*p1==*p2) cout << "Равны! "<< endl; ...

Реализация функции char *padl(const char *string, int len, int c=' ') - C++
Реализовать функцию возвращающую указатель на новую строку длины len, полученную из string либо удалением лишних символов слева , либо...

записать по-битого один short int в два char - C++
Здрасьте, всем. Записать побитого два char в один short int это: char char1; char char2; short int s; s=char1<<8|char2; А как...

Форматирование строк, char to int & int to char - C++
Покажите как запихнуть число в строку и вытащить его обратно из строки. Вот всё просто в pawn str_to_num(const str) // Тупо...

Как превести из char* в int и наоборот из int в char*? - C++
Как превести из char* aa='123' в int aa=123 и наоборот из int в char* . Понимаю что самому написать функцию не сложно, но наверняка это...

21
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 13:45 #2
Как на счет функции strcmp ( http://www.cplusplus.com/reference/cstring/strcmp/?kw=strcmp ) !?
0
Valentina
68 / 68 / 3
Регистрация: 13.05.2012
Сообщений: 130
15.07.2013, 13:46 #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;
}
0
rn3kk
0 / 0 / 0
Регистрация: 15.07.2013
Сообщений: 13
15.07.2013, 13:46  [ТС] #4
не помогает. долго. нужно посимвольно сравнить и принять решения. быстрее if() ничего не работает. Вопрос в алгоритме.
0
SatanaXIII
Супер-модератор
Эксперт С++
5619 / 2654 / 247
Регистрация: 01.11.2011
Сообщений: 6,553
Завершенные тесты: 1
15.07.2013, 13:47 #5
1) Ручками.
2) Получать коды символов и сравнивать их. Не знаю на сколько это будет быстрее, но кажется мне.
0
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 13:47 #6
Цитата Сообщение от rn3kk Посмотреть сообщение
не помогает. долго.
Там всего один цикл. Насколько ж быстро тебе надо?
0
rn3kk
0 / 0 / 0
Регистрация: 15.07.2013
Сообщений: 13
15.07.2013, 13:58  [ТС] #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; как то так.
0
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 14:06 #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 );
}
0
rn3kk
0 / 0 / 0
Регистрация: 15.07.2013
Сообщений: 13
15.07.2013, 14:14  [ТС] #9
lazybiz, необычно. сейчас попробуем.

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

Добавлено через 2 минуты
может имеет смысл в данном случае ассемблерная вставка?
0
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 14:22 #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 );
}
0
rn3kk
0 / 0 / 0
Регистрация: 15.07.2013
Сообщений: 13
15.07.2013, 14:30  [ТС] #11
lazybiz, =) не русгайся. спасибо. еще не попробоавл твой метод спасибо.

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

при мегабольшом кол-ве итераций привело к увеличению времени выполнения на 3 минуты. Всем спасибо.
0
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 14:33 #12
Я не понял, ты решил свою проблему?
Если нет то может код покажешь с входящими данными?
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
15.07.2013, 14:36 #13
А чем рукописный вариант будет быстрее предложенного в начале strcmp? Суть ведь та же.
0
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 14:37 #14
Ну может у него компилятор не умеет оптимизировать и не знает что такое inline-функции..
0
rn3kk
0 / 0 / 0
Регистрация: 15.07.2013
Сообщений: 13
15.07.2013, 14:40  [ТС] #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;
}
от такие дела ребята.
0
15.07.2013, 14:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2013, 14:40
Привет! Вот еще темы с ответами:

Вытащить числа в Int из Char - C++
Есть строка Char вида, например: &quot;PORES 23 6&quot; вот 2 числа которые идут после слова мне нужно вытащить и записать в отдельные переменные...

Конвертация числа в строку (int to char) - C++
Подскажите, какими процедурами пользоваться, каков синтаксис и формат введенных данных. Скажем есть char row; int t=25, n=9; каким...

Заменить int числа на char символы в списке - C++
как заменить int числа на char символы в списке, то есть, нужно чтообы список состоял из сисволов, код я нашел, но вот заменить никак не...

Перевод числа из массива char в целочисельное значение int - C++
Приведу пример: char* pDigit = new char; cin&gt;&gt;pDigit; предположим человек вводит: &quot;432dollars&quot; как в данном случае достать...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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