У меня была такая же проблема после обновления до Windows 10.
Это сработало для меня
Set-ExecutionPolicy Unrestricted
Если это все еще не работает [edit] devenv.exe.config
Visual Studio 2013: C:\Users\<UserName>\AppData\Local\Microsoft\VisualStudio\12.0
Visual Studio 2015: C:\Users\<UserName>\AppData\Local\Microsoft\VisualStudio\14.0
Добавьте следующие
<dependentAssembly>
<assemblyIdentity name="System.Management.Automation" publicKeyToken="31bf3856ad364e35" />
<publisherPolicy apply="no" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.PowerShell.Commands.Utility" publicKeyToken="31bf3856ad364e35" />
<publisherPolicy apply="no" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.PowerShell.ConsoleHost" publicKeyToken="31bf3856ad364e35" />
<publisherPolicy apply="no" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.PowerShell.Commands.Management" publicKeyToken="31bf3856ad364e35" />
<publisherPolicy apply="no" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.PowerShell.Security" publicKeyToken="31bf3856ad364e35" />
<publisherPolicy apply="no" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.PowerShell.Commands.Diagnostics" publicKeyToken="31bf3856ad364e35" />
<publisherPolicy apply="no" />
</dependentAssembly>
Это было пропущено из стандартного C ++ 98, но позже добавлено как часть TR. Предстоящий стандарт C ++ 0x, конечно, будет содержать это как требование.
Из n2798 (черновик C ++ 0x):
23.2.6 Вектор шаблона шаблона [vector]
1 Вектор представляет собой контейнер последовательности, который поддерживает итераторы с произвольным доступом. Кроме того, он поддерживает (амортизируется) постоянное время вставки и стирания операций в конце; вставлять и стирать в середине, принимать линейное время. Управление хранилищем обрабатывается автоматически, хотя можно дать подсказки для повышения эффективности. Элементы вектора сохраняются смежно, что означает, что если v - вектор, где T - некоторый тип, отличный от bool, то он подчиняется идентификатору & amp; v [n] == & amp; v [0] + n для всех 0 & lt; ; = n & lt; v.size ().
blockquote>
Да, элементы std :: vector гарантируют непрерывность.
Как указывали другие ответы, содержимое вектора гарантировано будет непрерывным (за исключением странности bool).
Комментарий, который я хотел добавить, заключается в том, что если вы делаете вставку или удаление на векторе, что может привести к перераспределению его памяти, тогда вы будете недействительными все ваши сохраненные указатели и итераторы.
Векторные контейнеры реализованы как динамические массивы; Как и обычные массивы, векторные контейнеры имеют свои элементы, хранящиеся в смежных местах хранения, что означает, что к их элементам можно получить доступ не только с помощью итераторов, но и с использованием смещений на регулярных указателях на элементы.
Стандарт фактически гарантирует, что vector
является непрерывным в памяти и что &a[0]
может быть передан функции C
, которая ожидает массив.
Исключением из этого правила является vector<bool>
, который использует только один бит на bool
, хотя он имеет непрерывную память, он не может использоваться как bool*
(это широко считается ложной оптимизацией и ошибкой).
Кстати, почему бы вам не использовать итераторы? Для этого они нужны.
Я нашел этот поток, потому что у меня есть прецедент, в котором преимуществом являются векторы, использующие непрерывную память.
Я изучаю, как использовать объекты вершинного буфера в OpenGL. Я создал класс-оболочку, содержащий логику буфера, поэтому мне нужно всего лишь передать массив поплавков и несколько значений конфигурации для создания буфера. Я хочу иметь возможность генерировать буфер из функции, основанной на пользовательском вводе, поэтому длина не известна во время компиляции. Сделать что-то вроде этого было бы самым простым решением:
void generate(std::vector<float> v)
{
float f = generate_next_float();
v.push_back(f);
}
Теперь я могу передать float вектора в виде массива для функций, связанных с буфером OpenGL. Это также устраняет необходимость в sizeof для определения длины массива.
Это намного лучше, чем выделение огромного массива для хранения поплавков и надеясь, что я сделал его достаточно большим или создав собственный динамический массив с непрерывное хранение.
v
, а не на v
? потому что передача только v
приведет к тому, что внутри функции будет сделана копия, которая перестанет существовать после завершения функции. Таким образом, вы нажимаете что-то на вектор только для удаления вектора, когда функция заканчивается.
– johnbakers
5 April 2013 в 01:31
Как уже говорили другие, vector
внутренне использует непрерывный массив объектов. Указатели в этот массив должны рассматриваться как недействительные, когда любая неконстантная функция-член называется IIRC.
Однако существует исключение !!
vector<bool>
имеет специализированную реализацию, разработанную для экономии места, так что каждый bool использует только один бит. Базовый массив не является смежным массивом арифметики bool и массива на vector<bool>
не работает, как vector<T>
.
(я полагаю, также возможно, что это может быть справедливо для любой специализации вектора , так как мы всегда можем реализовать новую. Однако std::vector<bool>
является единственной, ошибочной, стандартной специализацией, на которой простая арифметика указателя не будет работать.)
std::vector
, и все другие векторы необходимы для использования непрерывного хранилища. Поэтому std::vector<bool>
(к счастью) является единственным стандартным вектором, который является странным. (Я твердо придерживаюсь мнения, что эта специализация должна быть устаревшей и заменена, например, std::dynamic_bitset
с почти одинаковой функциональностью. Это не плохая структура данных, это просто не вектор.)
– Arne Vogel
22 September 2017 в 09:57