草庐IT

c++ - 我应该使用 boost::ptr_vector<T> 还是 vector<boost::shared_ptr<T>>?

我需要一个指针容器。你会推荐boost::ptr_vector或std::vector>?(或者别的什么?)如果感兴趣的话,我的实际数据结构相对复杂(见here)并且目前存储对象,而不是指针,但我想改变它(使用指针容器),以摆脱不必要的复制:typedefstd::multimap>VecElem;std::vectorvec; 最佳答案 谁拥有对象?如果容器拥有对象(意味着对象的生命周期不应超过容器),请使用ptr_vector。否则,使用shared_ptr的vector。标准库容器(例如std::vector或std::lis

c++ - 如何根据结构中的某些字段在 C++ 中的结构 vector 中获取最小或最大元素

如何根据结构中的某些字段在C++中获取结构vector中的最小或最大元素?例如:structSize{intwidth,height;};vectorsizes;现在我想根据width解决这个问题并为此创建一个新vector。然后根据height进行排序并为此创建一个新vector。 最佳答案 在C++11中,您可以使用std::minmax_element()标准函数,它(给定一对迭代器)和可能的自定义比较器(允许您定义排序所基于的字段)将返回一个迭代器到最小值和一个迭代器到最大元素,打包在std::pair中。例如:#inclu

c++ - 如何根据结构中的某些字段在 C++ 中的结构 vector 中获取最小或最大元素

如何根据结构中的某些字段在C++中获取结构vector中的最小或最大元素?例如:structSize{intwidth,height;};vectorsizes;现在我想根据width解决这个问题并为此创建一个新vector。然后根据height进行排序并为此创建一个新vector。 最佳答案 在C++11中,您可以使用std::minmax_element()标准函数,它(给定一对迭代器)和可能的自定义比较器(允许您定义排序所基于的字段)将返回一个迭代器到最小值和一个迭代器到最大元素,打包在std::pair中。例如:#inclu

c++ - 将 vector 作为数组传递是否安全?

假设我有一个函数:voidsomeFunc(int*x,intcount);这是我无法控制的,所以我不能写它来接受迭代器。这样称呼是否安全(不管具体的STL实现如何):vectorv;/*...*/someFunc(&v[0],v.size());很明显,一个反例是vector.其他类型呢?(假设我没有以任何方式专门化vector)。 最佳答案 从标准的第23.2.4节第1点开始:[...]Theelementsofavectorarestoredcontiguously,meaningthatifvisavectorwhereTi

c++ - 将 vector 作为数组传递是否安全?

假设我有一个函数:voidsomeFunc(int*x,intcount);这是我无法控制的,所以我不能写它来接受迭代器。这样称呼是否安全(不管具体的STL实现如何):vectorv;/*...*/someFunc(&v[0],v.size());很明显,一个反例是vector.其他类型呢?(假设我没有以任何方式专门化vector)。 最佳答案 从标准的第23.2.4节第1点开始:[...]Theelementsofavectorarestoredcontiguously,meaningthatifvisavectorwhereTi

c++ - std::vector<char> 的 max_size() 是否有错误?

我对std::vector::max_size()的结果感到困惑在我测试过的n=32和n=64位系统上。结果是2n-1。让我解释一下为什么我感到困惑。std::vector的每个实现我知道有三个T*类型的成员:begin_,end_,capacity_.begin_指向vector的第一个值和end_指向最后一个。因此,vector的大小由end_-begin_给出.但是这种差异的结果是类型std::ptrdiff_t这是我所知道的每个实现中的n位的有符号整数。因此,该类型不能存储2n−1,而最多只能存储2n−1−1.如果您查看您的std::vector实现时,您会清楚地看到大小会产生

c++ - std::vector<char> 的 max_size() 是否有错误?

我对std::vector::max_size()的结果感到困惑在我测试过的n=32和n=64位系统上。结果是2n-1。让我解释一下为什么我感到困惑。std::vector的每个实现我知道有三个T*类型的成员:begin_,end_,capacity_.begin_指向vector的第一个值和end_指向最后一个。因此,vector的大小由end_-begin_给出.但是这种差异的结果是类型std::ptrdiff_t这是我所知道的每个实现中的n位的有符号整数。因此,该类型不能存储2n−1,而最多只能存储2n−1−1.如果您查看您的std::vector实现时,您会清楚地看到大小会产生

c++ - 如何在构造时为 std::vector 保留内存?

通常我在构造std::vector后立即调用reserve。这通常不会导致std::vector的现有堆分配被破坏并替换为新的吗?有没有办法在构建时保留内存而不是分配堆空间然后立即销毁它?或者std::vector中是否有实现技巧来确保这不是问题?可用的构造函数似乎只能用于用值填充std::vector,而不是显式保留空间。 最佳答案 您的问题基于一个错误的前提,即默认构造的std::vector将执行[零长度]分配。实际上没有理由这样做。一个新的vector应该有zero的容量(尽管这是理智所要求的,而不是标准所要求的)。因此,您

c++ - 如何在构造时为 std::vector 保留内存?

通常我在构造std::vector后立即调用reserve。这通常不会导致std::vector的现有堆分配被破坏并替换为新的吗?有没有办法在构建时保留内存而不是分配堆空间然后立即销毁它?或者std::vector中是否有实现技巧来确保这不是问题?可用的构造函数似乎只能用于用值填充std::vector,而不是显式保留空间。 最佳答案 您的问题基于一个错误的前提,即默认构造的std::vector将执行[零长度]分配。实际上没有理由这样做。一个新的vector应该有zero的容量(尽管这是理智所要求的,而不是标准所要求的)。因此,您

c++ - 将 std::list<std::unique_ptr> 移动到 vector 中尝试引用已删除的函数

这是一个完整的程序,可以重现我的问题。#include#include#include#includeintmain(){std::vector>>v;std::list>l;l.push_back(std::make_unique(0));l.push_back(std::make_unique(1));v.push_back(std::move(l));//error}在最后一行,编译器提示std::unique_ptr的deleted复制构造函数被引用。由于我将列表移动到vector中,我假设不会对列表的元素调用任何复制构造函数。为什么会这样?我将如何解决它?我正在使用MSVC2