C++ 11: новый язык?

Вы используете класс символов , который будет одним из перечисленных символов. Таким образом, ваш паттерн ([\w\s.-]).[jpg] будет захватывать группу, соответствующую одному из [\w\s.-], затем совпадать с любым символом, кроме новой строки из-за точки ., а затем совпадать с одним из [jpg].

Для ваших примеров данных, которые предоставят вам группу захвата для L и совпадение для og, а также группу захвата для 0, 1, 3 и совпадение для .j ]

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

/([^/]*[^/\d])\d*\.jpg

Regex demo | Python demo

Это будет соответствовать

  • / Соответствовать буквально
  • ( Группа захвата (будет содержать название бренда)
    • [^/]* Совпадение не / 0+ раз и не / с использованием отрицательных классов символов
    • [^/\d] Совпадение не является / или цифра
  • ) Закрыть группу
  • \d* Совпадение 0+ раз цифра
  • \.jpg Совпадение .jpg
  • [ 1138]

31
задан Xeo 18 December 2011 в 22:29
поделиться

11 ответов

In short, no, we can't consider this a new language. It's the same language, new features. But instead of being bolted on by using the Boost libs, they're now going to be standard inclusions if you're using a compiler that supports the 0x standard.

One doesn't have to use the new standard while using a compiler that supports the new standard. One will have to learn and use the new standard if certain constraints exist on the software being developed, however, but that's a constraint with any software endeavor. I think that the new features that the 0x standard brings will make doing certain things easier and less error prone, so it's to one's advantage to learn what the new features are, and how they will improve their design strategy for future work. One will also have to learn it so that when working on software developed with it, they will understand what's going on and not make large boo-boos.

As to whether I will "switch to the new standard", if that means that I will learn the new standard and use it where applicable and where it increases my productivity, then yes, I certainly plan to switch. However, if this means that I will limit myself to only working with the new features of the 0x standard, then no, since much of my work involves code written before the standard and it would be a colossal undertaking to redesign everything to use the new features. Not only that, but it may introduce new bugs and performance issues that I'm not aware of without experience.

Learning C++ has always been one of the more challenging journeys a programmer can undertake. Adding new features to the language will not change the difficulty of learning its syntax and how to use it effectively, but the approach will change. People will still learn about pointers and how they work, but they'll also learn about smart pointers and how they're managed. In some cases, people will learn things differently than before. For example, people will still need to learn how to initialize things, but now they'll learn about Uniform Initialization and Initializer Lists as primary ways to do things. In some cases, perhaps understanding things will be easier with the addition of the new for syntax for ranges or the auto return type in a function declaration. I think that overall, C++ will become easier to learn and use while at the same time becoming easier to teach.

Mastering a language is a long-term goal, it can not be done over night. It's silly to think that one can have mastery over something as complex as C++ quickly. It takes practice, experience and debugging code to really hammer something in. Academically learning is one thing, but putting to use that knowledge is an entire different monster. I think that if one already has mastery of the C++ language, the new concepts will not pose too much of a burden, but a new comer may have an advantage in that they won't bother learning some of the more obsolete ways of doing things.

18
ответ дан 27 November 2019 в 21:37
поделиться

1) Сам язык

Насколько я знаю, действительно нет существенных изменений между C ++ '03 и C ++' 0x. Единственное, что я могу придумать, касается использования auto как спецификатор класса хранения, но так как он не имеет семантической Это означает, что я не вижу в этом проблемы.

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

2) Знание языка

Лично я чувствую, что для 99,9% разработчиков C ++ более новый язык будет проще в использовании. Я специально думаю о таких функциях, как авто, лямбда и constexpr. Эти функции действительно должны сделать использование языка более приятным.

На более продвинутом уровне у вас есть другие функции, такие как variadic. шаблоны и т. д., которые помогают более продвинутым пользователям.

Но здесь нет ничего нового, я все еще удивлен количеством обычные разработчики C ++, которые не использовали (или даже не слышали) о STL.

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

Обновление после публикации FDIS для голосования:

Как это происходит, «концепции» были отброшены для C ++ 0x и будет снова принят для C ++ 1x. В конце концов, есть некоторые изменения, отличные от auto , которые могут нарушить ваш код, но на практике они, вероятно, будут довольно редкими. Основные различия можно найти в Приложении C.2 FDIS (pdf) .

15
ответ дан 27 November 2019 в 21:37
поделиться

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

Хорошо, что вам не нужно осваивать все новые особенности. Одно из основных требований для органа стандартизации - не нарушать существующий код, так что вы сможете продолжать, счастливо кодируя в своем старом стиле (я все еще в основном программист на C, хотя я делаю приложения на C ++: -).

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

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

9
ответ дан 27 November 2019 в 21:37
поделиться

В некоторых отношениях, C ++ 0x должен быть легче для обучения / изучения, чем текущий C ++:

  • Цикл через контейнер - новый для синтаксис намного проще, чем for_each + функтор или цикл вручную с помощью итераторов
  • Инициализация контейнеров: мы сможем инициализировать последовательности с тем же синтаксисом, что и для массивов
  • Управление памятью: выход идет изворотливо старый auto_ptr , in поставляется с четко определенными unique_ptr и shared_ptr

лямбдами, хотя и обязательно более сложными, чем эквиваленты других языков, будет легче выучить, чем C + +98 процесс определения функциональных объектов в другом объеме.

8
ответ дан 27 November 2019 в 21:37
поделиться

Планируете ли вы перейти на новый стандарт или идти в ногу со «старым» стандартом (ами)?

Год назад я писал строгий C89, потому что рассматриваемый продукт был агрессивно переносим на встраиваемые платформы, некоторые из которых имели компиляторы с радикально отличающимися представлениями о том, какие биты C99 стоит поддерживать. Таким образом, 20-летний стандарт все еще не полностью заменен его 10-летним преемником.

Так что я не Я не ожидаю, что смогу уйти от C ++ 03 в ближайшее время.

Я ожидаю использовать функции C ++ 0x, где это уместно. Так же, как я использую функции C99 в коде C и расширения gcc в C и C ++ (и буду использовать расширения MSVC, хотя я никогда не работал над кодом только для MSVC более чем тривиальные периоды времени). Но я ожидаю, что это будет «хорошо иметь», а не исходный уровень, в значительной степени неопределенно.

7
ответ дан 27 November 2019 в 21:37
поделиться

Ваша карьера программиста всегда будет включать обучение и переобучение. Вы не можете ожидать, что c ++ останется таким же, пока вы не уйдете на пенсию и будете использовать те же методы и практики, которые вы использовали 40 лет назад. Технология развивается, и она быстро развивается. Это ваша работа, чтобы не отставать от этого. Конечно, вы можете игнорировать это и продолжать работать так же, как в настоящее время, но через 5/10 лет вы настолько устареете, что будете вынуждены выучить все это тогда, когда будете пытаться сменить работу. , И все эти годы было намного легче учиться на работе :)

5
ответ дан 27 November 2019 в 21:37
поделиться

Несколько месяцев назад я слышал, как Бьярн Страуструп выступил с докладом под названием 50 лет C ++ . По общему признанию, я не программист C ++, но мне казалось, что он определенно не думает, что 0x - это новый язык!

4
ответ дан 27 November 2019 в 21:37
поделиться

Whether or not we can consider it a "new language", I think that's semantics. It doesn't make a difference. It's backwards compatible with our current C++ code, and it's a better language. Whether or not we consider it "the same language" doesn't matter.

About learning the language, remember that a lot of the new features are there to make the language easier to learn and use. Most of the features that add complexity are intended for library developers only. They can use these new features to make better, more efficient, and easier to use libraries, that you can then use without knowing about the features. Several of the changes actually simplify and generalize existing features, making them easier for newcomers to learn.

It is a big update, yes, but it is guided by a decade of experience with the current C++ standard. Every change is there because experience has shown that it is needed. In fact, the committee is being extremely cautious and conservative, and have refused a huge number of other language improvements. What is added here is only the fundamentals that 1) everyone could agree on, and 2) could be specified in time, without delaying the new standard.

It is not simply a few language designers sitting down and brainstorming new features they'd like to try.

3
ответ дан 27 November 2019 в 21:37
поделиться

Концепции и концептуальные карты значительно улучшат возможности шаблонных структур. Если вы когда-нибудь поливали источник Boost, вы поймете, что я имею в виду. Вы постоянно переходите от исходного документа к документу, потому что у языка просто нет средств для выражения шаблонных концепций. Надеемся, что Concepts + Duck Typing предоставит нам лучшее из обоих миров, благодаря которым точки входа в библиотеки шаблонов могут явно декларировать требования, но при этом обладают свободой, которую предоставляет Duck Typing при написании универсального кода.

В C ++ есть много хороших вещей 0x, но это в основном эволюционные изменения, которые улучшают или расширяют существующие идеи. Я не думаю, что это достаточно отличается, чтобы оправдать называть это «новым языком».

3
ответ дан 27 November 2019 в 21:37
поделиться

For me, one of the most important, will be:

unique_ptr + std::move() !

Imagine:

  1. Smart pointer without any overhead:

    • no reference counting operations
    • no additional storage for reference counter variable
  2. Smart pointer that can be moved, ie. no destructor/constructor calls when moved

What does this give you? Exception safe, cheap (pointers..) containers without any costs. The container will be able to just memcpy() unique_ptrs, so there will be no performance loss caused by wrapping regular pointer by smart pointer! So, once again:

  1. You can use pointers
  2. It will be safe (no memory leaks)
  3. It will cost you nothing
  4. You will be able to store them in containers, and they will be able to do "massive" moves (memcpy-like) with them cheaply.
  5. It will be exception safe

:)

Another point of view:

  1. Actually, when you move group of objects using copy(), there is constructor and destructor call for every object instance. When you copy 1000 objects of 1kb size, there will be at least one memcpy() and 2000 function calls.
  2. If you would want to avoid the thousands of calls, you would have to use pointers.
  3. But pointers are: dangerous, etc. Actual smart pointers will not help you, they solve other problems.
  4. There is no solution for now. You must pay for C++ RAII/pointer/valuevars design from time to time. But with C++0x, using unique_ptr will allow to do "massive" moves of objects (yes, practically objects, because pointer will be smart) without "massive" constructor/destructor calls, and without risk of using pointers! For me, this is really important.

It's like relaxing the RAII concept (because of using pointers) without loosing RAII benefits. Another aspect: pointer wrapped in unique_ptr() will behave in many aspects similar to java reference object variable. The difference is that unique_ptr() will be able to exist in only one scope at a time.

12
ответ дан 27 November 2019 в 21:37
поделиться

Вы правы, но так было всегда. Существует много кода C ++, который до сих пор не включает ничего из стандарта 98 года только из-за врожденного консерватизма некоторых программистов. Некоторые из нас помнят темные времена перед пространством имен std :: (фактически, до пространств имен), когда каждый писал свой собственный строковый класс, а указатели все время ходили голыми. Есть причина, по которой мы говорим о «современном стиле C ++» - чтобы отличить его от более раннего стиля, потому что некоторым людям все еще приходится поддерживать или обновлять код в этом стиле.

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

С появлением C ++ 0x в поставляемых компиляторах этот разговор будет повторяться снова и снова в командах разработчиков по всему миру:

ЯНГСТЕР: Я только что открыл для себя такие вещи, как лямбды! И я нахожу множество способов использовать их, чтобы сделать наш код более выразительным! Послушайте, я переписал ваш старый класс Foo, не так ли лучше?

ОЛДСТЕР: В моем старом классе Foo все было в порядке. Вы просто ищете предлоги для ненужного использования "крутой" новой функции. Почему ты все время пытаешься сделать мою жизнь такой сложной? Почему мне постоянно приходится узнавать что-то новое? Нам нужна еще одна война, это то, что нам нужно.

ЮНГСТЕР: Ты слишком застрял на своем пути, старик, нам даже не следовало бы использовать C ++ в наши дни ... если бы это зависело от меня -

OLDSTER: Если бы я зависел от меня, мы бы остановились на PL / 1, но нет ... моей жене пришлось проголосовать за Картера, и теперь мы застряли во всей этой объектно-ориентированной чуши. Вы ничего не можете сделать с std :: transform и лямбдами, чего я не могу сделать с goto и парой меток.

и т. Д.

7
ответ дан 27 November 2019 в 21:37
поделиться
Другие вопросы по тегам:

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