Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

программы-шутки/головоломки (C/C++)

505
31 мая 2009 года
vAC
343 / / 28.02.2006
Чуть больше года назад я начал собирать маленькие программы-шутки, головоломки или
просто тесты на знание языка C/C++. Какие-то были взяты из книг, другие из собственной практики.
Хотелось бы поделиться некоторыми и попросить других участников форума прислать свои.
Для упрощения кода можно считать, что все необходимые заголовочные файлы подключены.
Вот некоторые из моих:

1. Что будет выведено на экран?
 
Код:
const bool b = false ? true ? false ? true : false : true : false; // what??/
std::cout << b;


2.Чему равны переменные a и b после выполнения следующего кода:
 
Код:
int a = 1;
int b = 2;
b = a+++1;


3.Чему равна вложенная переменная x?
 
Код:
const int x = 1;
{
    int x = x;
}


4. Чему равны значения N::x и N::y?
 
Код:
const int x = 1;
namespace N {
    enum { x = x+1, y = x };
}


5. Корректен ли код?
 
Код:
const int x = 2;
{
int x[x];
}


6. Корректен ли код?
 
Код:
template<class T> class X {
X<T*> p;
};
...
X<int> x;


7. Корректен ли код? Если да, то что будет выведено на экран?
Код:
namespace N1 {
    struct S {};
    void f(void (*)(S)) { std::cout << "N1::f"; }
}
namespace N2 {
    void f(void (*)(N1::S)) { std::cout << "N2::f"; }
    void g(N1::S)
    {
        f(g);
    }
}
...
N2::g(N1::S());


8.Что будет выведено на экран?
Код:
class A {
public:
    A() { std::cout << "default" << std::endl; }
    A(long) { std::cout << "long" << std::endl; }
    explicit A(int) { std::cout << "int" << std::endl; }
    A(const A&) { std::cout << "copy" << std::endl; }
    A &operator=(const A&) { std::cout << "operator=" << std::endl; return *this; }
};
...
const int i = 0;
A a1();
A a2 = i;
A a3(i);
A a4 = A(i);
A a5 = (A) i;
A a6 = static_cast<A>(i);
7.4K
31 мая 2009 года
T...H
159 / / 28.12.2008
первая - неприкольно.
вторая тоже понятно.
вот третье - вот я не угадал.
7
31 мая 2009 года
@pixo $oft
3.4K / / 20.09.2006
Рискну предположить,что
Цитата: vAC
Чему равны переменные a и b после выполнения следующего кода:
 
Код:
int a = 1;
int b = 2;
b = a+++1;

a=2,b=3

Цитата: vAC
Чему равна вложенная переменная x?
 
Код:
const int x = 1;
{
    int x = x;
}

x=<неизвестно что>,ибо

Цитата:
Задача:
Мальвина дала Буратино 3 яблока,потом забрала назад 1
Впорос:Сколько яблок осталось у Буратино?
Ответ:ХЗ.Никто не знает сколько у него яблок было до того
Мораль:ВСЕГДА инициализируйте переменные

Прошу поправить меня,если неправильно(конечно,неправильно!Я ж вообще не знаю Си…)

505
31 мая 2009 года
vAC
343 / / 28.02.2006
Цитата: T...H
первая - неприкольно.


Я надеюсь вы пробовали ее запускать? Прикол состоит не во вложенных выражениях <A>?<B>:<C>, а в комментарии

А 3-я и 4-я подобраны на одну тему - понятие точки определения.

2@pixo $oft:
1. a=2,b=2.
2. верно, но здесь опять таки фокус в точке определения. Если теоретически допустить, что она была бы за равенством, то было бы значение 1...

7.4K
31 мая 2009 года
T...H
159 / / 28.12.2008
const int x = 1;
{
int x = x;
}
я сам не врубился, откуда там 1 получится в vcl приложении и... вроде 255 или 256, когда выполняешь этот код в консоли...
7.4K
31 мая 2009 года
T...H
159 / / 28.12.2008
Цитата:
а в комментарии


при компиляции и выводе получилось 0, что равнозначно false. тупо..

505
31 мая 2009 года
vAC
343 / / 28.02.2006
2T...H
что за компилятор?
Видимо триграфы он не поддерживает, а следовательно не соответствует стандарту ISO/IEC 9899...
Если использовать "стандартный" компилятор, то вывода не будет никакого
505
31 мая 2009 года
vAC
343 / / 28.02.2006
Цитата: T...H
я сам не врубился, откуда там 1 получится в vcl приложении и... вроде 255 или 256, когда выполняешь этот код в консоли...


я же не говорил, что будет 1, а только сделал гипотетическое допущение. Будет мусорное значение, зависящее от реализации компилятора. Не исключено даже, что это может быть и 0

505
31 мая 2009 года
vAC
343 / / 28.02.2006
Вот еще задачка: написать программу, распечатывающую собственный код. (разумеется, решения типа прочитать файл с исходником и распечатать не допускаются).

А вот решение:
 
Код:
#include <stdio.h>
int main() {
  const char *p_str;
  printf(p_str,10,10,10,34,p_str="#include <stdio.h>%cint main() {%c  const char *p_str;%c  printf(p_str,10,10,10,34,p_str=%c%s%c,34,10);%c}",34,10);
}

Только для наглядности нужно расширить область вывода консоли)
505
31 мая 2009 года
vAC
343 / / 28.02.2006
Вторая задача действитльно суховата, поэтому откорректирую ее:

Чему равны переменные a,b,c после выполнения следующего кода:
 
Код:
int a = 1;
int b = 1;
int c = a+++b++;
7.4K
31 мая 2009 года
T...H
159 / / 28.12.2008
Цитата:
распечатывающую собственный код.


норм. правда с небольшими опечатками.. :D

350
01 июля 2009 года
cheburator
589 / / 01.06.2006
Простите, а цель поста-то какая, всё таки? Попросить всех присылать подобные задачи, или решать ваши?
41K
08 июля 2009 года
Alex57
44 / / 22.02.2009
Какое значение будет иметь переменная k ?
 
Код:
int k=8;
k = k++;
316
09 июля 2009 года
Alm3n
889 / / 29.05.2009
Вперед и с песней.Только не компилировать,иначе не интересно будет.Код 100% работает.
Код:
#include <stdio.h>
#define _ 0xF<00? --F<00||--F-OO--:-F<00||--F-OO--;
int F=00,OO=00;
main()
{

       F_OO();printf("%1.3f\n",4.*-F/OO/OO);
       }
       F_OO()
{
               _-_-_-_
          _-_-_-_-_-_-_-_-_
       _-_-_-_-_-_-_-_-_-_-_-_
     _-_-_-_-_-_-_-_-_-_-_-_-_-_
    _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
   _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
   _-_-_-_-_-_-_-_-_-_-_-_-_-_
     _-_-_-_-_-_-_-_-_-_-_-_
         _-_-_-_-_-_-_-_
             _-_-_-_
}
240
09 июля 2009 года
aks
2.5K / / 14.07.2006
Цитата: cheburator
Простите, а цель поста-то какая, всё таки? Попросить всех присылать подобные задачи, или решать ваши?


Ну видимо обсуждать, предлагать свои, не очевидные или не тривиальные куски кода на C++, коих может быть на самом деле довольно много.

Цитата: Alex57
Какое значение будет иметь переменная k ?
 
Код:
int k=10;
k = k++;


Любое. Ну что за банальности. =)

Цитата: Alm3n
Вперед и с песней.Только не компилировать,иначе не интересно будет.Код 100% работает.


Ну это уже С а не С++ даже. Не мне в уме что то считать лень - подожду ответа. :D

3
10 июля 2009 года
Green
4.8K / / 20.01.2000
Цитата: aks

Любое. Ну что за банальности. =)


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

87
14 июля 2009 года
Kogrom
2.7K / / 02.02.2008
Мне больше нравится, когда кто-нибудь типа Rififi чего-нибудь завернет с помощью STL алгоритмов и функторов. Жалко, что редко такие примеры встречаются.
505
15 июля 2009 года
vAC
343 / / 28.02.2006
Вот еще вариация 6-го примера:
 
Код:
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]template[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]<[/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]class[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] T>
[/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]class[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] X {
[/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]public[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]:
    X() { X<T *> t; }
};
X<[/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]> x;
[/SIZE]

Все компиляторы которые у меня есть уходят далеко и надолго. Только gcc и vc6.0 выводят что-то на консоль
5
15 июля 2009 года
hardcase
4.5K / / 09.08.2005
2vAC: Мем такой вот припомнил, но не C++:
http://forum.codenet.ru/showthread.php?t=45826
505
15 июля 2009 года
vAC
343 / / 28.02.2006
Цитата: Kogrom
Мне больше нравится, когда кто-нибудь типа Rififi чего-нибудь завернет с помощью STL алгоритмов и функторов. Жалко, что редко такие примеры встречаются.



Боюсь, что баян...Пример на неправильное проектирование предикатов:

Код:
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]#include [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]<iostream>[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]#include [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]<vector>[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]#include [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]<algorithm>[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]class [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]Selector[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] {[/SIZE]
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]public[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]:[/SIZE]
[SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001] Selector[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]([COLOR=#0000ff]int [/COLOR][/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]selection[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2])[/SIZE]
[SIZE=2] : [/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]selection_[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]selection[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]),[/SIZE]
[SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001] count_[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2](0)[/SIZE]
[SIZE=2] {[/SIZE]
[SIZE=2] }[/SIZE]
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff] bool [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]operator[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]()([SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][/COLOR][/SIZE][/SIZE][SIZE=2])[/SIZE]
[SIZE=2] {[/SIZE]
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]     return[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] ++[/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]count_[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] == [/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]selection_[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2];[/SIZE]
[SIZE=2] }[/SIZE]
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]private[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]:[/SIZE]
[SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff] int [/COLOR][/SIZE][/COLOR][/SIZE][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]selection_[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2];[/SIZE]
[SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001] [COLOR=#0000ff]int [/COLOR][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]count_[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2];[/SIZE]
[SIZE=2]};[/SIZE]
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]int [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]main[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]()[/SIZE]
[SIZE=2]{[/SIZE]
  [SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]std[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]::[/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]vector[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]<[/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]> [/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]v[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2];[/SIZE]
  [SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]for[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] ([/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]size_t [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]ind[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] = 0; [/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]ind[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] < 10; ++[/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]ind[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2])[/SIZE]
    [SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]v[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].[/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]push_back[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]ind[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]);[/SIZE]
  [SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]v[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].[/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]erase[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]std[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]::[/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]remove_if[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]v[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].[/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]begin[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2](), [/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]v[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].[/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]end[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2](), [/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]Selector[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2](5)), [/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]v[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].[/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]end[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]());[/SIZE]
  [SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]std[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]::[/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]copy[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]v[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].[/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]begin[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2](), [/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]v[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].[/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]end[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2](), [/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]std[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]::[/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]ostream_iterator[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]<[/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]>([/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]std[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]::[/SIZE][SIZE=2][COLOR=#010001][SIZE=2][COLOR=#010001]cout[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2], [/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]" "[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]));[/SIZE]
[SIZE=2]}[/SIZE]

Собственно, что будет выведено на экран?
3
15 июля 2009 года
Green
4.8K / / 20.01.2000
Цитата: vAC
Боюсь, что баян...Пример на неправильное проектирование предикатов:


Думаю, проектирование предикатов ту не при чем.
IMHO, это некоторая корявость STL связанная с повсеместной передачей аргументов по значению.

87
15 июля 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: vAC
Собственно, что будет выведено на экран?


мда... куда-то девятка делась. Хотя в следующем, измененном примере, она есть:

Код:
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>

template < class ForwardIterator, class Predicate >
ForwardIterator my_remove_if ( ForwardIterator first, ForwardIterator last,
                               Predicate pred )
{
    ForwardIterator result = first;
    for ( ; first != last; ++first)
        if (!pred(*first)) *result++ = *first;
    return result;
}

class Selector
{
public:
    Selector(int selection)
            : selection_(selection),
            count_(0)
    {
    }
    bool operator()(int)
    {
        return ++count_ == selection_;
    }
private:
    int selection_;
    int count_;
};

int main()
{
    std::vector<int> v;
    for (size_t ind = 0; ind < 10; ++ind)
        v.push_back(ind);
    v.erase(my_remove_if(v.begin(), v.end(), Selector(5)), v.end());
    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
}

Функция взята отсюда:
http://www.cplusplus.com/reference/algorithm/remove_if/
3
15 июля 2009 года
Green
4.8K / / 20.01.2000
Цитата: Kogrom
мда... куда-то девятка делась.


> IMHO, это некоторая корявость STL связанная с повсеместной передачей аргументов по значению.

505
15 июля 2009 года
vAC
343 / / 28.02.2006
Цитата: Green
Думаю, проектирование предикатов ту не при чем.


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

Поэтому, не считаю, что кривость в STL. Нужно исправлять стандарт и накладывать дополнительные условия...

3
15 июля 2009 года
Green
4.8K / / 20.01.2000
Цитата: vAC
Ну если придерживаться стандарта, то предикаты рекомендуется проектировать таким образом, чтобы их результат не зависил от состояния объекта. В данном случае эта рекомендация нарушена, а стандарт не гарантирует того, что не будут создаваться и использоваться копий предиката.

Поэтому, не считаю, что кривость в STL. Нужно исправлять стандарт и накладывать дополнительные условия...


Ну это как раз таки кривость STL (не конкретной реализации, а в ообщем).
Это же не специально придуманная для удобства фича, а как раз таки наоборот - неудобное ограничение вызванное др. особенностями STL (передачей по значению).

P.S. Кстати, где в стандарте рекомендации к предикатам? (нет стандарта под рукой)

505
15 июля 2009 года
vAC
343 / / 28.02.2006
Цитата: Green
IMHO, это некоторая корявость STL связанная с повсеместной передачей аргументов по значению.



Кстати, есть еще пример, который якобы обходит этот недостаток, но в студии он все равно не работает:

Код:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Generator {
public:
    Generator()
        : i_(0)
    {
    }
    int operator()()
    {
        return i_++;
    }
private:
    int i_;
};
int main()
{
    typedef vector<int>::iterator iterator_t;
    vector<int> v1(10), v2(10);
    Generator gen;
    generate<iterator_t, Generator &>(v1.begin(), v1.end(), gen);
    generate<iterator_t, Generator &>(v2.begin(), v2.end(), gen);
    copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
    cout << endl;
    copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));
}

Происходит это из-за неявного указания параметров шаблона в функции-обертке.
505
15 июля 2009 года
vAC
343 / / 28.02.2006
Цитата: Green
Ну это как раз таки кривость STL (не конкретной реализации, а в ообщем).
Это же не специально придуманная для удобства фича, а как раз таки наоборот - неудобное ограничение вызванное др. особенностями STL (передачей по значению).

P.S. Кстати, где в стандарте рекомендации к предикатам? (нет стандарта под рукой)



В самом стандарте рекомендации конечно нет, она так сказать из него вытекает.
А в примере с предикатом проблема не в передаче по значению, а в том, что создается копия предиката.

288
15 июля 2009 года
nikitozz
1.2K / / 09.03.2007
Цитата: vAC

А в примере с предикатом проблема не в передаче по значению, а в том, что создается копия предиката.



Собственно копия предиката и создается при передаче его по значению. :)

505
15 июля 2009 года
vAC
343 / / 28.02.2006
Цитата: nikitozz
Собственно копия предиката и создается при передаче его по значению. :)



Да, все так и происходит. Но "фатальное" копирование происходит не при передаче в remove_if, а внутри нее, при вызове find_if после которого состояние предиката не изменится.

505
17 июля 2009 года
vAC
343 / / 28.02.2006
Предлагаю подумать над тем, как обойти проблему с передачей по значению. Для этого возьмем пример:
Код:
template<typename T>
void redir(T t)
{
    ++t;
}
template<typename T>
void inc(T t)
{
    redir(t);
}
 
 
#include <iostream>
 
using std::cout;
 
int main()
{
    int i = 0;
    inc<int &>(i);
    cout << i; // по-прежнему 0
}

Требуется не изменяя inc и redir заставить работать код так, как ожидалось.
87
17 июля 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: vAC
Требуется не изменяя inc и redir заставить работать код так, как ожидалось.


умные ссылки рулят... Хотя за надежность не ручаюсь:

Код:
template<typename T>
void redir(T t)
{
    ++t;
}
template<typename T>
void inc(T t)
{
    redir(t);
}


#include <iostream>

using std::cout;

struct Ptr
{
    int &p;
    Ptr(int &pp):p(pp){}
    void operator++()
    {
        ++p;
    }
};


int main()
{
    int i = 0;
    inc<Ptr>(Ptr(i));
    cout << i; // по-прежнему 0?
}
505
17 июля 2009 года
vAC
343 / / 28.02.2006
В принципе да, но можно сделать более гибкий вариант, не прибегая к определению оператора, ну и обобщить Ptr для всех встроенных типов...
87
17 июля 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: vAC
Впринципи да, но можно сделать более гибкий вариант, не прибегая к определению оператора, ну и обобщить Ptr для всех встроенных типов...



Я только идею показал - потому без шаблонов. Как сделать без определения оператора пока не вижу.

Добавлено позже: если только извратиться типа:

Код:
template<typename T>
void redir(T t)
{
    ++t;
}
template<typename T>
void inc(T t)
{
    redir(t);
}


#include <iostream>

using std::cout;

template<typename T>
struct Ptr
{
    T &p;
    Ptr(T &pp):p(pp){}
};


template<typename T>
struct PtrInc: public Ptr<T>
{
    PtrInc(T &pp): Ptr<T>(pp){}
    void operator++()
    {
        ++Ptr<T>::p;
    }
};

int main()
{
    int i = 0;
    inc<PtrInc<int> >(PtrInc<int>(i));
    cout << i; // по-прежнему 0
}
3
17 июля 2009 года
Green
4.8K / / 20.01.2000
Код:
template<typename T>
void redir(T t)
{
    ++t;
}
template<typename T>
void inc(T t)
{
    redir(t);
}

#include <iostream>
using namespace std;


template<typename T>
class Ref
{
public:
    Ref(int& ref) :_ref(ref) {}
    operator T&() {
        return _ref;
    }

private:
    T& _ref;    
};

template<typename T>
Ref<T> Reff(T& ref) {
    return ref;
}


int main()
{
    int i = 0;
    inc( Reff(i) );
    cout << i << endl;  // по-прежнему 0?
}
505
17 июля 2009 года
vAC
343 / / 28.02.2006
2Green: с точностью до нейминга как мое решение :)
87
17 июля 2009 года
Kogrom
2.7K / / 02.02.2008
Эээ... Попытаюсь расшифровать: если не понял - прошу поправить.
В функции redir и inc копируется обертка (объект класса Ref), к которой функция пытается применить операции, которые не определены в классе. Тогда происходит преобразование типа в ссылку типа T с помощью оператора operator T&(). С полученной ссылкой уже можно проводить операции типа инкремента, декремента и пр.

Функция Reff нужна для красоты. Можно обойтись без нее, воспользовавшись конструктором типа Ref<int>(i).

На счет нейминга - вылетело из головы, как будет ссылка по английски. Заменил на указатель.
41K
17 июля 2009 года
Alex57
44 / / 22.02.2009
Код:
#include <iostream.h>

template<typename T>
void redir(T & t)
{
    ++t;
}
template<typename T>
void inc(T & t)
{
    redir(t);
}

void main()
{
    int i=0;
    inc(i);
    cout << i << endl;    //  теперь  i == 1
    inc(i);
    cout << i << endl;      //  а теперь  i == 2
}
505
17 июля 2009 года
vAC
343 / / 28.02.2006
2Alex57: читай внимательнее задание, данная ситуация моделирует реализацию STL.
2Kogrom: да, все так. Но такой фокус работает только со встроенными типами.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог