станд.:: карта, указатель для отображения значения ключа действительно ли это возможно?

Вы хотите, чтобы начальные / конечные пробелы разрешались во всей строке или вокруг каждого отдельного адреса?

Для первого вашего регулярного выражения должно быть

/^(\s*([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+([,.](([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+\s*)*$/

, а для последнего

/^(\s*([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25}\s*)+([,.](\s*([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+\s*)*$/
24
задан michael 5 February 2009 в 14:02
поделиться

4 ответа

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

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

то, Что Вы могли сделать, создают маленький объект как:

struct StringPtrInMap
{
  typedef std::map<string,string>::iterator iterator;
  StringPtrInMap(iterator i) : it(i) {}
  const string& operator*() const { return it->first; }
  const string* operator->() const { return &it->first; }
  iterator it;
}

И затем хранят это вместо указателя строки.

20
ответ дан Mooing Duck 16 October 2019 в 07:52
поделиться

Раздел 23.1.2#8 (ассоциативные контейнерные требования):

участники вставки не должны влиять на законность итераторов и ссылок на контейнер, и участники стирания должны делать недействительным только итераторы и ссылки на стертые элементы.

Так да указатели хранения на элементы данных элемента карты, как гарантируют, будут допустимы, если Вы не удалите тот элемент.

52
ответ дан Greg Rogers 16 October 2019 в 07:52
поделиться

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

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

карта:: вставьте , с другой стороны, не упоминает ничего вида.

, Поскольку Pierre сказал, необходимо сохранить итератор, а не указатель, все же.

1
ответ дан drby 16 October 2019 в 07:52
поделиться

Почему Вы желаете сделать это?

Вы не можете изменить значение *p, так как это - станд. константы:: строка. Если бы Вы действительно изменяли его, то Вы могли бы повредить инварианты контейнера путем изменения порядка сортировки элементов.

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

0
ответ дан Richard Wolf 16 October 2019 в 07:52
поделиться
Другие вопросы по тегам:

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