stdvector 相关问题

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

为什么是(-1< a.size()) false, even though std::vector's size is positive?

请看一下这个简单的程序: #包括 #包括 int main() { std::向量 a; std::cout << "vector size " << a....

回答 3 投票 0

有没有更好的方法来获取指向 std::vector<bool> 元素的指针?

我知道 std::vector 是 std::vector 的一个奇怪的特化,除其他外,它的缺点是无法获取对单个元素的指针/引用。 ...

回答 1 投票 0

为什么我不能“销毁”“自有”的CRTP向量,但仍然可以释放其地址?

摘自 Björn Fahller 在 2023 年 CPP 会议上的闪电演讲。 => youtu.be/LKKmPAQFNgE 这是关于如何在不接触 new 甚至 malloc 的情况下强制 c++ 泄漏内存。 结构 V:向量 摘自 Björn Fahller 在 2023 年 CPP 会议上的闪电演讲。=> youtu.be/LKKmPAQFNgE 这是关于如何在不接触 new 甚至 malloc 的情况下强制 C++ 泄漏内存。 struct V : vector<V> {}; auto v = V{}; v.emplace_back(); v.swap(v.front()); // v representation becomes uint64_t[3]{ 0x0, 0x0, 0x0}, // so the vector allocation gets lost because no refs are left on the scope. 所以我想知道是否可以手动销毁它。 struct V : vector<V> {}; auto v = V{}; v.emplace_back(); v.emplace_back(); v.emplace_back(); v.emplace_back(); auto front = v.front(); v.swap(v.front()); using allocator = std::allocator<V>; using atraits = std::allocator_traits<allocator>; auto a = front.get_allocator(); atraits::destroy(a, &front + 1); // Ok atraits::destroy(a, &front + 2); // Ok atraits::destroy(a, &front + 3); // Ok // atraits::destroy(a, &front); // error SIGSEGV atraits::deallocate(a, &front, 4); // still seems Ok? 当尝试销毁拥有自己地址的 V 对象时,会发生SIGSEGV。 0x1796320 : 0x1796320 (alloc_begin_ptr) // It owns itself!!! 0x1796328 : 0x1796380 (one_pass_content_end_ptr) 0x1796330 : 0x1796380 (one_pass_alloc_end_ptr) 0x1796338 : 0x0 (alloc_begin_ptr) 0x1796340 : 0x0 (one_pass_content_end_ptr) 0x1796348 : 0x0 (one_pass_alloc_end_ptr) 0x1796350 : 0x0 (alloc_begin_ptr) 0x1796358 : 0x0 (one_pass_content_end_ptr) 0x1796360 : 0x0 (one_pass_alloc_end_ptr) 0x1796368 : 0x0 (alloc_begin_ptr) 0x1796370 : 0x0 (one_pass_content_end_ptr) 0x1796378 : 0x0 (one_pass_alloc_end_ptr) 所以我尝试将其移至堆栈。看起来效果不错。 struct V : vector<V> {}; auto v = V{}; v.emplace_back(); v.emplace_back(); v.emplace_back(); v.emplace_back(); auto front = v.front(); v.swap(v.front()); auto v2 = std::move(front); 没有任何对象拥有自己。 0x7ffc44d02b20 : 0x927320 (alloc_begin_ptr) // v2 on stack 0x7ffc44d02b28 : 0x927380 (one_pass_content_end_ptr) 0x7ffc44d02b30 : 0x927380 (one_pass_alloc_end_ptr) 0x927320 : 0x0 (alloc_begin_ptr) 0x927328 : 0x0 (one_pass_content_end_ptr) 0x927330 : 0x0 (one_pass_alloc_end_ptr) 0x927338 : 0x0 (alloc_begin_ptr) 0x927340 : 0x0 (one_pass_content_end_ptr) 0x927348 : 0x0 (one_pass_alloc_end_ptr) 0x927350 : 0x0 (alloc_begin_ptr) 0x927358 : 0x0 (one_pass_content_end_ptr) 0x927360 : 0x0 (one_pass_alloc_end_ptr) 0x927368 : 0x0 (alloc_begin_ptr) 0x927370 : 0x0 (one_pass_content_end_ptr) 0x927378 : 0x0 (one_pass_alloc_end_ptr) 为什么拥有自身的 allocator_traits::destroy() 上的 vector 会触发 SIGSEGV ? // atraits::destroy(a, &front); // error SIGSEGV 0x1796320 : 0x1796320 (alloc_begin_ptr) // It owns itself!!! 0x1796328 : 0x1796380 (one_pass_content_end_ptr) 0x1796330 : 0x1796380 (one_pass_alloc_end_ptr) [直播] (我假设这一行: auto front = v.front(); 是一个拼写错误,因为 v.front() 是您从中复制的默认构造的 V 对象。这意味着该线本质上是auto front = V{}。你的意思是auto& front = v.front()) &front + 1、&front + 2和&front + 3是指向空向量的指针,这些可以被销毁。 如果您试图破坏 &front 指向的内容,则这是具有 4 个元素的向量。最后三个元素是那些空向量,被销毁是没有问题的。 但 front 的第一个元素是 front 本身。这是未定义的行为,因为您将在已经被销毁的对象上调用析构函数,但实际上它会导致无限循环,因为它只会再次调用析构函数并递归地尝试销毁相同的向量(以及堆栈溢出,从而导致段错误)。 如果您只是释放它,则不会调用析构函数,因此不会出现无限循环。如果向量保存了分配内存的其他向量,则可能会泄漏内存,因为这些向量的析构函数也不会被调用。 正如您所尝试的那样,“修复”此问题的方法是打破“所有权”循环,例如将其移动到新向量(V{} = std::move(front) / V{}.swap(front))。

回答 1 投票 0

C++11:来自第二个元素的范围循环向量?

我有一个 std::vector v; (已初始化)。如何使用 range-for 循环来访问除第一个元素(索引为零)之外的所有元素。对于所有元素: 对于(常量字符串&...

回答 4 投票 0

在c++中查找满足给定条件的向量元素的位置

我正在学习c++,我想用c++实现以下python代码: C = np.where(A > B)[0] 当 len(C) > 0 时: d = C[0] # 对 A[d] 和 B[d] 做一些事情 C = A > B 一个和...

回答 1 投票 0

如何使用 C 风格数组分配 std::vector?

从 C 风格数组初始化 std::vector 最便宜的方法是什么? 示例:在下面的课程中,我有一个向量,但由于外部限制,数据将以 C 风格传入...

回答 6 投票 0

如何在迭代时删除向量中的元素?

我想使用擦除方法从向量中清除元素。但这里的问题是,不能保证该元素在向量中只出现一次。它可能会出现多次,并且我...

回答 7 投票 0

如何在迭代时从 std::vector 中删除元素?

我有一个 std::vector m_vPaths;我迭代这个向量并调用 ::DeleteFile(strPath) 。如果我成功删除该文件,我会将其从向量中删除。 我的问题是:...

回答 3 投票 0

是否可以恢复`std::span`中元素的实际索引?

我有一个带有 std::vector 成员变量的类。我还有一个成员函数,它采用 std::vector 中的连续范围(由两个 size_t 参数指定),并执行一些操作...

回答 1 投票 0

向量<pair<string, string>>擦除()不减少大小[关闭]

#包括 #包括 使用命名空间 std; int main() { std::vector > vec1 = { {"1", "0"}, {"2",&...

回答 1 投票 0

查找向量中的重复项<pair<string, string>>(向量.第一和向量.第二)

我有一对字符串向量: 矢量>组合; 组合中的数据。首先: 对于 (int i = 0; i < combinations.size(); i++) { cout << combination...

回答 1 投票 0

迭代器或反向迭代器的一个变量? [重复]

我想在for循环中迭代一些std::向量,但根据某些条件,向量应向前或向后迭代。我想,我可以使用其中任何一个轻松做到这一点

回答 1 投票 0

将数据直接Memcpy到std::vector

使用 memcpy 直接将数据复制到 std::vector 的底层缓冲区是否合法?像这样的东西: 字符缓冲区[255]; 填充缓冲(buf); std::vector vbuf; vbuf.调整大小(255); 内存复制(

回答 1 投票 0

STD::Vector-直接写入内部数组

下面的代码可以吗?: std::向量 var; size_t 必需的大小; getenv_s(&requiredSize, NULL, 0, "某事"); if (必需的大小 == 0) { 返回ENV_NOT_EXIST; } if(var.size() &...

回答 2 投票 0

std::vector 做了奇怪的事情

我正在开发一个函数,该函数读取文件,存储以冒号开头的每一行,并删除字符串中包含的每个破折号。 每次找到这种行,都会使用push_back()...

回答 1 投票 0

使用智能指针在 C++ 中的直接无环图中连接父/子会导致 SIGSEGV

我正在尝试用 C++20 构建 DAG。每个节点都有多个子节点和父节点。作为 MWE,每个节点都可能计算一些值。 此代码来自 Java 世界,可以按预期工作: 导入j...

回答 1 投票 0

如何在从另一个容器创建 std::vector 时确保一次性内存分配?

当我需要从另一个容器的某些元素创建 std::vector 时,例如另一个向量,确保新向量仅在内存中分配一次的最安全方法是: std::向量&l...

回答 2 投票 0

为什么向量中的原始指针不会变成nullptr? [重复]

我想动态分配一个int,然后将相应的指针推入向量中。使用后,我将向量的所有元素设置为nullptr,但原始指针并没有变成nullptr。 ...

回答 1 投票 0

对向量的列表初始化

我正在列表初始化一个保存整数对的向量。 我按照预期理解以下作品: std::vector> vpairs_first{std::make_pair(0, 1), std::make_pair(0...

回答 1 投票 0

如何从 std::vector 的其中一项的引用中获取其元素的索引?

您将如何优雅地(以现代 C++ 方式)编写一个返回向量元素索引的函数,并将该向量作为参数,并引用其元素之一? 例外哈...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.