Почему не делают стандартные адаптеры контейнера C++ обеспечивают ясную функцию?

s = r'abc123d, hello 3.1415926, this is my book'
print re.findall(r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+',s)

Вам не нужно escape дважды, когда вы используете raw mode.

Выход: ['123', '3.1415926']

Также тип возврата будет списком strings .Если вы хотите, чтобы возвращаемый тип, как integers и floats, использовал map

import re,ast
s = r'abc123d, hello 3.1415926, this is my book'
print map(ast.literal_eval,re.findall(r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+',s))

Выход: [123, 3.1415926]

23
задан Michael Kristofik 29 January 2009 в 22:48
поделиться

6 ответов

Ну, я думаю, что это вызвано тем, что clear не считался допустимой операцией на очереди, priority_queue или стеке (между прочим, двухсторонняя очередь не и адаптер, но контейнер).

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

Поэтому при использовании очереди, все, что можно сделать, продвинуть/вытолкать элементы; очистка очереди может рассматриваться как нарушение понятия FIFO. Следовательно, если необходимо очистить очередь, возможно, это не действительно очередь, и необходимо лучше использовать двухстороннюю очередь.

Однако эта концепция вещей немного ограничена, и я думаю, очищая очередь, как Вы делаете достаточно справедливо.

19
ответ дан Luc Touraille 29 November 2019 в 02:36
поделиться

Двухсторонняя очередь имеет ясный (). Посмотрите, например, http://www.cplusplus.com/reference/stl/deque/clear.html .

Однако очередь не делает. Но почему Вы предпочли бы очередь двухсторонней очереди, так или иначе?

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

( http://www.sgi.com/tech/stl/queue.html )

, Таким образом, я предполагаю ясный (), не работа с очередями, затем.

11
ответ дан Reunanen 29 November 2019 в 02:36
поделиться

Я сказал бы, что это - потому что контейнерные адаптеры не являются контейнерами.

2
ответ дан MSN 29 November 2019 в 02:36
поделиться

Вы CAN очищаете очереди (и станд.:: стек и priority_queue), пока Вы наследовались ему. Контейнер намеренно оставляют защищенным для разрешения этого.

#include <queue>

using namespace std;

class clearable_queue : public queue<int>
{
public:
  void clear()
    {
      // the container 'c' in queues is intentionally left protected
      c.clear();
    }
};   

int main(int argc, char** argv)
{
  clearable_queue a;
  a.clear();
}
1
ответ дан codelogic 29 November 2019 в 02:36
поделиться

Я думаю, что это зависит от реализации - до недавнего времени, Microsoft STL не имела ясным на нескольких контейнерах. (это делает теперь, например, этот быстрый результат Google )

Однако ясный () часто просто вызов для стирания (начните (), конец ()), так реализуйте собственный эквивалент и использование это вместо этого.

я думаю, что стандарт относится для очистки как стирающийся по диапазону итератора, таким образом, вышеупомянутое - то, что обеспечит большинство реализаций. (, например, Dinkumware )

-1
ответ дан gbjbaanb 29 November 2019 в 02:36
поделиться

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

можно очистить базовый контейнер, пока можно получить доступ к нему. Чтобы сделать это, создайте базовый контейнер, чтобы передать в apadptor конструктору. Например:

std::deque< int > d;
std::queue< int > q( d );

... time passes ...

d.clear();

Редактирование: дополнительная информация

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

-2
ответ дан Daniel Paull 29 November 2019 в 02:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: