Вы можете:
vector<unique_ptr<T>>
или vector<optional<T>>
или vector<some_other_defer_storage_mechanism<T>>
вместо просто vector<T>
- это все типы упаковщиков, которые добавляют некоторую функциональность T
, не затрагивая [ 115] (unique_ptr<T>
делает его подвижным, optional<T>
обеспечивает построение по умолчанию, поэтому вы можете построить с правильным размером, затем emplace()
в пределах optional
и т. Д.) deque<T>
, который не требует подвижности для emplace_back
(хотя вы теряете смежность) pair<unique_ptr<T[]>, size_t>
, который просто выделяет пространство для n
T
с, а затем размещает новости на каждый из них, гарантируя, что разрушение делает правильные вещи. Это не так уж плохо для реализации - так как вы не будете изменять размер, вам нужно поддерживать минимальное количество общих операций. Какой из этих ответов самый лучший, действительно зависит.
Мы использовали код, подобный этому, в большинстве наших сценариев в течение нескольких лет без проблем:
#--------------------------------------------------------------------
# Dot source support scripts
#--------------------------------------------------------------------
$ScriptPath = $MyInvocation.MyCommand.Path
$ScriptDir = Split-Path -Parent $ScriptPath
. $ScriptDir\BuildVars.ps1
. $ScriptDir\LibraryBuildUtils.ps1
. $ScriptDir\BuildReportUtils.ps1
Недавно я столкнулся с той же проблемой. Следующая статья помогла мне решить проблему: http://blogs.msdn.com/powershell/archive/2007/06/19/get-scriptdirectory.aspx
Если вас не интересует, как это работает Вот весь код, который вам нужен для этой статьи:
function Get-ScriptDirectory
{
$Invocation = (Get-Variable MyInvocation -Scope 1).Value
Split-Path $Invocation.MyCommand.Path
}
И затем вы получите путь, просто выполнив:
$path = Get-ScriptDirectory
Я думаю, вы можете найти путь к вашему запущенному сценарию, используя
$MyInvocation.MyCommand.Path
Надеюсь, это поможет!
Седрик
Это одна из тех странностей (по крайней мере, на мой взгляд) в PS. Я уверен, что для этого есть вполне веская причина, но мне все равно это кажется странным. Итак:
Если вы находитесь в скрипте, но не в функции, то $ myInvocation.InvocationName даст вам полный путь, включая имя скрипта. Если вы находитесь в скрипте и находитесь внутри функции, то $ myInvocation.ScriptName даст вам то же самое.