Tag: stdvector

在C ++中的vector存储

我希望存储一个d维点的大向量(d fixed和small:<10)。 如果我将一个Point定义为vector<int> ,我认为一个vector<Point>将在每个位置存储一个指向Point的指针。 但是,如果将Point定义为像std::tuple<int,int,…,int>或std::array<int, d>这样的固定大小的对象,程序会将所有点存储在连续的内存中还是将间接的额外水平仍然存在? 如果答案是数组避免了额外的间接寻址,那么在扫描vector<Point>会不会影响性能(caching利用本地化)?

有一个标准的方法将范围移动到vector中吗?

考虑下面的程序,它将一系列元素插入到一个向量中: vector<string> v1; vector<string> v2; v1.push_back("one"); v1.push_back("two"); v1.push_back("three"); v2.push_back("four"); v2.push_back("five"); v2.push_back("six"); v1.insert(v1.end(), v2.begin(), v2.end()); 这有效地复制范围,在整个范围内为目标向量分配足够的空间,以便最大限度地调整一个大小。 现在考虑下面这个试图将范围移入向量的程序: vector<string> v1; vector<string> v2; v1.push_back("one"); v1.push_back("two"); v1.push_back("three"); v2.push_back("four"); v2.push_back("five"); v2.push_back("six"); for_each ( v2.begin(), v2.end(), [&v1]( string & s ) { v1.emplace_back(std::move(s)); }); 这将执行一个成功的移动,但是不能享受insert()在预先分配目标向量中的空间方面的好处,所以在操作过程中可以重新调整向量的大小。 所以我的问题是,有一个插入等价物可以将范围移动到一个向量?

在C ++ std :: vector和C数组之间转换而不复制

我希望能够在std :: vector及其底层C数组int *之间进行转换,而不显式复制数据。 std :: vector是否提供对底层C数组的访问? 我正在寻找这样的东西 vector<int> v (4,100) int* pv = v.c_array(); 编辑: 此外,是否有可能做相反的事情,即如何从C数组初始化std::vector而不复制? int pv[4] = { 4, 4, 4, 4}; vector<int> v (pv);

在C ++中检查std :: vector <string>是否包含某个值

是否有任何内置函数告诉我,我的向量包含某个元素或没有,例如 std::vector<string> v; v.push_back("abc"); v.push_back("xyz"); if (v.contains("abc")) // I am looking for one such feature, is there any // such function or i need to loop through whole vector?

std :: set vs向量或映射的优点

这可能是一个愚蠢的问题,我对C ++和编程一般来说是相当新的。 我希望了解几个STL容器的使用,考虑到这一点,我想知道使用std :: set和使用向量或映射的好处是什么? 我似乎无法find这个问题的明确答案。 我注意到集合使用地图,但为什么不总是使用地图或总是使用集合。 而是提供了2个非常类似的容器。 提前致谢。

vector :: at vs vector :: operator

我知道at()慢于[]是因为它的边界检查,这也是类似的问题,如C ++向量在/ []运算符速度或:: std :: vector :: at()vs运算符[] < <令人惊讶的结果! 慢5到10倍/更快! 。 我只是不明白at()方法的好处。 如果我有这样一个简单的向量: std::vector<int> v(10); 我决定通过使用at()而不是[]来访问它的元素,当我有一个索引i ,我不确定它是否在向量边界,它迫使我用try-catch块包装它 : try { v.at(i) = 2; } catch (std::out_of_range& oor) { … } 尽pipe我可以通过使用size()来获得相同的行为,并且自己检查索引,这对我来说似乎更容易和方便: if (i < v.size()) v[i] = 2; 所以我的问题是: 使用vector :: at over vector :: operator []的优点是什么? 什么时候应该使用vector :: at而不是vector :: size + vector […]

为什么要调用vector.reserve(required + 1)比vector.reserve(required)要快?

我正在做一些testing标准容器在各种条件下的性能的testing,我遇到了一些奇怪的事情。 当我向std::vector中插入多个项目时,如果我首先调用reserve来确定要添加的元素的确切数目,那么在大多数情况下,我看不出与不调用reserve的性能差别,奇怪。 然而,更令人惊讶的是,如果我将所需要的元素的确切数量加上保留数+ 1 ,那么我将得到显着的性能提升。 这是我刚刚得到的结果样本表(所有时间都是在几秒钟内): +—————+——–+——————-+———————–+ | # of elements | vector | vector (reserved) | vector (reserved + 1) | +—————+——–+——————-+———————–+ | 10000 | 0.04 | 0.04 | 0.03 | | 20000 | 0.14 | 0.14 | 0.11 | | 30000 | 0.32 | 0.32 | 0.25 | | 40000 | 0.55 | […]

使用std :: vector作为一个简单的缓冲区是不错的做法吗?

我有一个应用程序正在执行一些image processing。 考虑到我知道宽度/高度/格式等(我这样做),并考虑定义缓冲区来存储像素数据: 然后,而不是在unsigned char*上使用new和delete [] ,并保留一个单独的缓冲区大小的笔记,我想通过使用std::vector来简化事情。 所以我会声明我的类是这样的: #include <vector> class MyClass { // … etc. … public: virtual void OnImageReceived(unsigned char *pPixels, unsigned int uPixelCount); private: std::vector<unsigned char> m_pImageBuffer; // buffer for 8-bit pixels // … etc. … }; 然后,当我收到一个新的图像(某些可变大小的图像 – 但不用担心这些细节)时,我可以调整vector大小(如有必要)并复制像素: void MyClass::OnImageReceived(unsigned char *pPixels, unsigned int uPixelCount) { // called when a […]

C ++:比较两个向量

有什么办法比较两个向量? if (vector1 == vector2) DoSomething(); 注意:目前,这些向量不被sorting并包含整数值。

是开始()==结束()任何空()向量?

我早就认为对于任何空的std::vector V , V.begin() == V.end() 。 然而,我在C ++规范中没有看到任何东西,这一切都是真实的。 这是否一定是真的,或者在大多数实现中恰好是真的?