Questions tagged «stdvector»

序列类型定义为标准库的一部分。

3
std :: vector(ab)使用自动存储
考虑以下代码段: #include <array> int main() { using huge_type = std::array<char, 20*1024*1024>; huge_type t; } 显然,它将在大多数平台上崩溃,因为默认堆栈大小通常小于20MB。 现在考虑以下代码: #include <array> #include <vector> int main() { using huge_type = std::array<char, 20*1024*1024>; std::vector<huge_type> v(1); } 令人惊讶的是它也崩溃了!追溯(使用最新的libstdc ++版本之一)指向include/bits/stl_uninitialized.h文件,我们可以在其中看到以下几行: typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType; std::fill(__first, __last, _ValueType()); 调整大小的vector构造函数必须默认初始化元素,这就是它的实现方式。显然,_ValueType()临时崩溃会使堆栈崩溃。 问题是这是否是符合标准的实现。如果是,那么实际上意味着使用巨大类型的向量是非常有限的,不是吗?

3
如何在编译时获取多维std :: vector的深度?
我有一个函数,需要一个多维参数std::vector,需要将深度(或维数)作为模板参数传递。与其对这个值​​进行硬编码,我想编写一个constexpr函数,该函数将std::vector并将深度作为unsigned integer值返回。 例如: std::vector<std::vector<std::vector<int>>> v = { { { 0, 1}, { 2, 3 } }, { { 4, 5}, { 6, 7 } }, }; // Returns 3 size_t depth = GetDepth(v); 不过,这需要在编译时完成,因为此深度将作为模板参数传递给模板函数: // Same as calling foo<3>(v); foo<GetDepth(v)>(v); 有什么办法吗?

2
添加到std :: vector时类字段的行为异常
在以下情况下,我发现了一些非常奇怪的行为(在clang和GCC上)。我有一个向量,nodes有一个元素,一个class的实例Node。然后,我在上调用一个函数nodes[0],Node以向向量添加新的函数。添加新节点后,将重置调用对象的字段!但是,一旦功能完成,它们似乎又恢复正常。 我相信这是一个最小的可复制示例: #include <iostream> #include <vector> using namespace std; struct Node; vector<Node> nodes; struct Node{ int X; void set(){ X = 3; cout << "Before, X = " << X << endl; nodes.push_back(Node()); cout << "After, X = " << X << endl; } }; int main() { nodes = …

6
使用std :: vector :: swap方法在C ++中交换两个不同的向量是否安全?
假设您具有以下代码: #include <iostream> #include <string> #include <vector> int main() { std::vector<std::string> First{"example", "second" , "C++" , "Hello world" }; std::vector<std::string> Second{"Hello"}; First.swap(Second); for(auto a : Second) std::cout << a << "\n"; return 0; } 假设向量不是std::string,但是类: std::vector<Widget> WidgetVector; std::vector<Widget2> Widget2Vector; 用该std::vector::swap方法交换两个向量是否仍然安全:WidgetVector.swap(Widget2Vector);否则将导致UB?
30 c++  c++11  vector  stdvector  swap 

3
在两个范围内以降序对向量排序
假设我有一个整数向量: std::vector<int> indices; for (int i=0; i<15; i++) indices.push_back(i); 然后我按降序对其进行排序: sort(indices.begin(), indices.end(), [](int first, int second) -> bool{return indices[first] > indices[second];}) for (int i=0; i<15; i++) printf("%i\n", indices[i]); 这将产生以下结果: 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 现在,我想将数字3、4、5和6移到末尾,并保持它们的降序(最好不必sort第二次使用)。即,这就是我想要的: 14 13 12 11 10 …

1
使std :: vector分配内存的现代方法
在以下问题是相关的,但答案是旧的,并且从用户评论马克Glisse表明有因为C ++ 17的新方法这个问题可能没有得到充分讨论。 我正在尝试使对齐的内存对于SIMD正常工作,同时仍然可以访问所有数据。 在Intel上,如果创建类型为float的向量__m256,并将大小减小8倍,则会使内存对齐。 例如 std::vector<__m256> mvec_a((N*M)/8); 以一种有点怪异的方式,我可以将指向矢量元素的指针强制转换为float,这使我可以访问各个float值。 取而代之的是,我希望具有一个std::vector<float>正确对齐的,因此可以在__m256不进行段错误的情况下加载到其他SIMD类型中。 我一直在研究aligned_alloc。 这可以给我一个正确对齐的C样式数组: auto align_sz = static_cast<std::size_t> (32); float* marr_a = (float*)aligned_alloc(align_sz, N*M*sizeof(float)); 但是我不确定如何执行此操作std::vector<float>。赋予std::vector<float>所有权marr_a 似乎是不可能的。 我已经看到一些建议,我应该编写一个自定义分配器,但这似乎需要大量工作,也许对于现代C ++,有更好的方法吗?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.