LINUX.ORG.RU

Список указателей, поиск по значению

 , c++03,


1

6

Привет. Есть такой список:

class A;
std::list<A*> myList;

Какие есть способы организовать поиск по значению? Пока что я пришёл только к этому:

A searchValue;
std::list<A*>::const_iterator iter;
for (iter = myList.begin(); iter != myList.end(); ++iter) {
   if (**iter == searchValue) break;
}
return *iter;

★★★★★

Последнее исправление: UVV (всего исправлений: 1)

Ответ на: комментарий от hateyoufeel

В C++ крайне грязная и неуклюжая реализация ООП

А где самая чистая, понятная и юзабельная реализация ООП по-твоему мнению?

EXL ★★★★★
()
Ответ на: комментарий от UVV

А как народ обходится без указателей? Типа в других платформах/языках garbage collector идеальный? Или они просто не подходят для низкоуровневых задач?

Подумай, часто ли тебе будут нужны указатели если убрать ручную работу с памятью.

Отсутствие GC в C++, кстати, убивает всю «высокоуровневость» на корню. И дело не столько в освобождении памяти - с этим RAII худо-бедно справляется, сколько в необходимости руками поддерживать локальность данных и бороться с фрагментацией кучи.

hateyoufeel ★★★★★
()

На cplusplus есть описание find http://www.cplusplus.com/reference/algorithm/find/?kw=find.
Видимо, если, искать по значению, то ничего лучше не придумать:

template<class InputIterator, class T>
  InputIterator find (InputIterator first, InputIterator last, const T& val)
{
  while (first!=last) {
    if (**first==val) return first;
    ++first;
  }
  return last;
}
four_str_sam
()
Ответ на: комментарий от UVV

А никак. Дописывают на сях в виде дллок или процессов хелперов всяких. Особенные (типа питона, сишарпа и вижуал васика) могут напрямую дллки дёргать. Короче без С (или любого другого умеющего указатели, типа ады, паскаля или окамла) никуда.

nanoolinux ★★★★
()
Ответ на: комментарий от UVV

что ты имеешь в виду? если указатели запрятаны под капот, то язык, очевидно, не подходит для низкоуровневых задач. при этом речь не идет о скорости (можно и без указателей писать быстрые программы) или о парадигмах. просто если язык поддерживает ООП И дает доступ к указателям, это (поддержка ооп в придачу) не позволяет называть его высокоуровневым по определению.

anonymous
()
Ответ на: комментарий от anonymous

тебе самое время закукарекать, что на эрланге все рашается в две строчки.

Пора выводить Закон Анона.
По мере разрастания дискуссии на LOR вероятность употребления сравнения с эрлангом стремится к единице.
Во многих срачах LORa существует традиция, согласно которой, как только подобное сравнение сделано, обсуждение считается завершённым, и сторона, прибегнувшая к этому аргументу в его негативном смысле, считается проигравшей.

anonymous
()
Ответ на: комментарий от nanoolinux

Анонимных классов действительно иногда не хватает.

unsigned ★★★★
()
Ответ на: комментарий от UVV

Стесняюсь спросить, а высокоуровневее это жабка с решёточкой?

PL/SQL - высокоуровнево, просто, энтерпрайзненько.

anonymous
()
Ответ на: комментарий от Pinkbyte

Именно это надмножество и повышает уровень. Такие дела :-)

Ну да, компилирую код gcc и он называется низкоуровненвым. Компилирую тот же код g++ и всё, высокоуровневый язык! Оценивать язык нужно принимая во внимание _все_ фичи.

А в википедиях высокоуровневым называют всё что выразительней ассемблера.

vladimir-vg ★★
()
Ответ на: комментарий от hateyoufeel

Нет, в плюсах её нет вообще. Сравни темплейты в плюсах и, например, в хаскелле.

Ага, в расширении ghc. Ну что там еще есть лиспы? nemerle? Может rust?

Мейнстрим, да.

Kuzy ★★★
()
Ответ на: комментарий от anonymous

Так что хаскель, как ни крути, это как раз то, чем должны быть кресты, если бы Страустрап не циклился на Си.

Скорее rust. Если примерно с той же концепцией, но не криво - D.

Kuzy ★★★
()
Ответ на: комментарий от vladimir-vg

Ну да, компилирую код gcc и он называется низкоуровненвым.

ты сможешь скомпилировать c++ код c-компилятором? Не думаю.

pinkbyte@oas1 ~/dev $ cat 1.c 
class A {};

int main() {
        return 0;
}
pinkbyte@oas1 ~/dev $ gcc 1.c 
1.c:1:1: ошибка: unknown type name «class»
1.c:1:9: ошибка: expected «=», «,», «;», «asm» or «__attribute__» before «{» token
pinkbyte@oas1 ~/dev $ g++ 1.c
pinkbyte@oas1 ~/dev $ ls -la a.out
-rwxr-xr-x 1 pinkbyte users 7992 авг 28 13:42 a.out
Pinkbyte ★★★★★
()
Ответ на: комментарий от vladimir-vg

Внезапно, возможность использования низкоуровневых конструкций наряду с высокоуровневыми не делает язык низкоуровневым. Я уже умолчу о том, что можно делать ассемблерные вставки.

Да, иногда использование некоторыми программистами C++ смахивает на обезьяну с гранатой. Но это не повод говорить, что язык - не то, чем он является. Просто не надо представлять C++ как серебряную пулю - только и всего.

Pinkbyte ★★★★★
()
Ответ на: комментарий от Pinkbyte

ты сможешь скомпилировать c++ код c-компилятором?

~> cat test.c
#define class struct

class A {};

int main() {
            return 0;
}
~> clang test.c -o test
~>

FIXED

Не думаю.

Мы это уже заметили. Я, кстати, тебя маразматиком начал считать ещё после общения в гентовой багзилле :)

hateyoufeel ★★★★★
()
Ответ на: комментарий от Kuzy

Ага, в расширении ghc.

Если учесть, что GHC - эталонная реализация языка (и единственная активно развивающаяся), то таки в хаскелле.

hateyoufeel ★★★★★
()
Ответ на: комментарий от Pinkbyte

ты сможешь скомпилировать c++ код c-компилятором? Не думаю.

exl@exl-Lenovo-G560e:~/SandBox > cat 1.C 
class A {};

int main() {
            return 0;
}
exl@exl-Lenovo-G560e:~/SandBox > gcc 1.C 
exl@exl-Lenovo-G560e:~/SandBox > ll a.out 
-rwxr-xr-x 1 exl exl 8505 Aug 28 16:48 a.out*

😸

EXL ★★★★★
()
Ответ на: комментарий от Kuzy

Я бы на это не смотрел столь оптимистично.

http://habrahabr.ru/post/218341/ для ъ -

...compile-time интерпретатора бестипового лямбда-исчисления

Самые сочные цитаты из статьи:

Не компилируется. И лог ошибок на 64 килобайта.

К сожалению, дождаться вычисления факториала семи мне не удалось, не говоря уже о том, что на 32-битных системах компилятор попросту умирает от переполнения стека.

nanoolinux ★★★★
()
Ответ на: комментарий от nanoolinux

раии то нету

Да там и кроме этого есть засады. Тут вообще нужна поддержка языка, longjmp - хак с кучей ограничений.

unsigned ★★★★
()
Ответ на: комментарий от Pinkbyte

Не, можно. Уже как-то выясняли, gcc сам подставляет нужный компилер. Но это не делает языки одинаковыми, тем не менее.

UVV ★★★★★
() автор топика
Ответ на: комментарий от nanoolinux

Я бы на это не смотрел столь оптимистично.

Столько же оптимистично сколько «Haskell подходит для задач крестов».

Kuzy ★★★
()
Ответ на: комментарий от hateyoufeel

Тогда причем тут эталонная реализация? Я знаю что у него есть стандарт и вот в нем TH нет.

Kuzy ★★★
()

В тред приперлись все. И те, кто по теме, и конь с копытом и рак с клешней.

Shadow1251
()
Ответ на: комментарий от hateyoufeel

Лучше вот это скомпилируй:

#include <iostream>

class A final {
public:
  A() = default;
  void *operator new(std::size_t) = delete;  
  void *operator new[](std::size_t) = delete;
  
  void operator()() {
    std::cout << __PRETTY_FUNCTION__ << std::endl;
  }
};

int main(int, char**) {
  A()();

  // не сработает
  // (*new A())();

  return 0;
}
А то define'ами class на struct менять в хелловорлдах все могут. Еще бы хотелось увидеть семантический эквивалент на С, раз уж ты сказал что С++ лишь «сахар» добавляет. Эквивалент универсальный, а не для конкретного приведенного мной примера.

NegatiV
()
Ответ на: комментарий от Kuzy

подходит для задач крестов

Что это за задачи такие? Получать сообщения об ошибках в десятки раз больше программы, содержащей ошибку?

hateyoufeel ★★★★★
()
Ответ на: комментарий от Kuzy

Например игры.

Детский сад, младшая группа. Что-нибудь посерьёзнее удовлетворения толстых задротов ты придумать можешь?

hateyoufeel ★★★★★
()
Ответ на: комментарий от UVV

Не, можно.
gcc сам подставляет нужный компилер.

Если расширение *.cpp сделать, например, тогда да, gcc код приведенный мною выше соберет

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 2)
Ответ на: комментарий от hateyoufeel

#define class struct

#define true false // счастливой отладки

Извини, не удержался. Знаешь, если сильно постараться, с помощью препроцессора можно весь С++ код в C-код превратить. Только - зачем?

Мы это уже заметили. Я, кстати, тебя маразматиком начал считать ещё после общения в гентовой багзилле :)

Не можешь аргументировать - перейди на личности. Хороший ход, годиков так 5 назад мог бы даже вывести меня из себя ;-)

Все пользователи, с которыми я конфликтовал в гентушной багзилле(было такое, но редко) либо могли объяснить мне почему я не прав и я извинялся, либо их неадекватность замечали остальные разработчики и принимали меры.

Если ты хочешь культурно и предметно поговорить по какому-то конкретному багрепорту - не вопрос, мои контакты - в профиле.

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 2)
Ответ на: комментарий от Pinkbyte

с помощью препроцессора можно весь С++ код в C-код превратить.

Препроцессор C не является Тьюринг-полным.

hateyoufeel ★★★★★
()
Ответ на: комментарий от Kuzy

Я говорил о препроцессоре. Я не говорил о ВСТРОЕННОМ в язык препроцессоре. На #define и #ifdef свет клином не сошёлся. flex+bison+что_нибудь_еще+ведро ЛСД(потому что в здравом уме такой ад пилить никто не станет)

Pinkbyte ★★★★★
()
Ответ на: комментарий от anonymous

Речь о трансляции C++ в С. GObject или Vala это умеют? То что они там ООП сделали - молодцы.

NegatiV
()
Ответ на: комментарий от anonymous

Там - попытка изобрести своё ООП, насколько кошерная - судить не берусь, слишком мало кода повидал и еще меньше - пописал.

Я же говорю об обратном процессе - есть C++ код, который обложен препроцессором, на выхлопе - чистый C код, который скармливается компилятору C.

И да, я слышал, что есть компиляторы, которые делают что-то подобное. Но это не отменяет факта того, что писать такое - тот еще ад.

Pinkbyte ★★★★★
()
Ответ на: комментарий от Pinkbyte

Я же говорю об обратном процессе - есть C++ код, который обложен препроцессором, на выхлопе - чистый C код, который скармливается компилятору C.

http://www.softwarepreservation.org/projects/c_plus_plus/index.html#cfront

Оригинальный компилятор C++ делал именно такой ад. Ещё у LLVM есть бэкенд в C.

hateyoufeel ★★★★★
()
Ответ на: комментарий от Miguel

Это я удачно зашёл.

Игнор для слабаков ;)

UVV ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Так что хаскель, как ни крути, это как раз то, чем должны быть кресты, если бы Страустрап не циклился на Си.

До Кея со Smalltalk-ом и его ООП на сообщениях, была Simula (с теми тремя китами). От которой, собственно, Страуструп и отталкивался, создавая C++.

eao197 ★★★★★
()
Ответ на: комментарий от hateyoufeel

Ну так C тоже добавляет синтаксический сахар вокруг мнемоников.
А мнемоники в свою очередь добавляют синтаксический сахар вокруг машинных кодов. А машинные коды добавляют синтаксический сахар вокруг микрокода.

invy ★★★★★
()
Ответ на: комментарий от hateyoufeel

С таким подходом можно заявить что С — язык поэзии, полур^wпогугли баяны про define, превращающий программы в повествовательные рассказы и стихи.

pylin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.