我一直在玩BlockingCollection类,我想知道为什么ToArray()方法是一个O(n)操作.来自Java背景,ArrayList的ToArray()方法在O(1)中运行,因为它只返回它使用的内部数组(elementData).那么为什么在世界上他们遍历所有项目,并在IEnumerable.ToArray方法中创建一个新的数组,当他们可以覆盖它并返回集合使用的内部数组?
启用调试/诊断时,您会在 Azure Pipeline 日志中看到所有这些条件调试语句。
##[debug] -NoLogo
##[debug] -NoProfile
##[debug] -NonInteractive
##[debug] -Command
Run Code Online (Sandbox Code Playgroud)
但是如何从 PipeLine YAML 文件、脚本或程序打印这些内容呢?我在 Azure PipeLines日志记录命令文档中看到了通过 powershell 记录警告和错误的示例。
echo "##vso[task.logissue type=error]Something went very wrong."
echo "##vso[task.logissue type=warning;sourcepath=consoleapp/main.cs;linenumber=1;columnnumber=1;code=100;]Found something that could be a problem."
Run Code Online (Sandbox Code Playgroud)
但条件调试详细语句中没有任何内容。
简单的问题,在处理数组或其他大型数据结构时,我通常会在我通常使用整数的地方强迫自己开始使用size_t(或unsigned longs?)会对我有好处吗?
假设你有一个向量指针:
auto myVectorPtr = myVector;
Run Code Online (Sandbox Code Playgroud)
您不知道,此向量的大小大于:
std::numeric_limits<int>::max();
Run Code Online (Sandbox Code Playgroud)
你有一个循环:
for(int i = 0; i < myVectorPtr->size(); ++i)
Run Code Online (Sandbox Code Playgroud)
使用不是更好
for(size_t i = 0; i < myVectorPtr->size(); ++i)
Run Code Online (Sandbox Code Playgroud)
避免遇到溢出?
我想我的问题确实是,在算术和其他常见操作中使用size_t(或unsigned longs?)是否有任何副作用.如果我开始使用size_t(或unsigned longs?)而不是经典int,我还需要注意什么.
很简单的问题,但为什么当你打电话时
std::vector<int> vec;
vec.reserve(100);
vec[89] = 99; // vector subscript out of range.-
Run Code Online (Sandbox Code Playgroud)
您不能访问向量的0-99元素?考虑到保留向量的增加容量(分配了那个大小的新数组)并且你应该能够访问这些元素,即使它们是空的或者为空启动,也没有多大意义.
我明白,如果你这样做的方式如下:
std::vector<int> vec(99, 0);
vec[89] = 99;
Run Code Online (Sandbox Code Playgroud)
您将被允许访问元素,因为它们将被初始化为0,但是,除了最初通过构造函数之外,您不能使用这样的默认值多次调整向量.
使用数组,可以做到:
int[] arr = new int[100];
arr[89] = 99;
Run Code Online (Sandbox Code Playgroud)
当然,您必须自己编写调整大小.
arr1 = new int[200]
memcpy (arr1, arr, 100);
arr = arr1;
arr[90] = 100;
Run Code Online (Sandbox Code Playgroud)
std::vector一旦达到一定的容量,有没有办法像对待自己调整大小的数组一样?