C++ 14提出std::dynarray:
std :: dynarray是一个序列容器,它封装了一个在构造时固定的大小的数组,并且在整个对象的生命周期内不会改变.
std::dynarray必须在运行时分配,如同std::vector.
那么std::dynarray我们可以使用std::vector哪些更有活力(又重新调整大小)的好处和用途是什么?
我知道这at()比[]它的边界检查慢,这也在类似的问题中讨论,如C++ Vector at/[] operator speed 或:: std :: vector :: at()vs operator [] << Surprising results !! 速度慢5到10倍!.我只是不明白这种at()方法有什么用处.
如果我有一个像这样的简单向量:std::vector<int> v(10);我决定通过使用at()而不是[]在我有索引的情况下访问它的元素i并且我不确定它是否在向量范围内,它迫使我用try-catch包装它块:
try
{
v.at(i) = 2;
}
catch (std::out_of_range& oor)
{
...
}
Run Code Online (Sandbox Code Playgroud)
虽然我能够通过自己使用size()和检查索引来获得相同的行为,这对我来说似乎更容易和方便:
if (i < v.size())
v[i] = 2;
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
使用vector :: at over vector :: operator []有什么好处?
我什么时候应该使用vector :: at而不是vector :: size …
在函数中返回std :: vector时复制了多少数据,将std :: vector放在free-store(在堆上)并返回指针的优化程度是多少,即:
std::vector *f()
{
std::vector *result = new std::vector();
/*
Insert elements into result
*/
return result;
}
Run Code Online (Sandbox Code Playgroud)
效率高于:
std::vector f()
{
std::vector result;
/*
Insert elements into result
*/
return result;
}
Run Code Online (Sandbox Code Playgroud)
?
有没有办法比较两个向量?
if (vector1 == vector2)
DoSomething();
Run Code Online (Sandbox Code Playgroud)
注意:目前,这些向量未排序并包含整数值.
是否有内置函数告诉我我的矢量包含某个元素,例如
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?
Run Code Online (Sandbox Code Playgroud) 我一直认为,对于任何空std::vector V,V.begin() == V.end().然而,我在C++规范中没有看到任何说明这一点始终是真的.它是否一定是真的,或者在大多数实现中是否恰好是真的?
我正在使用Debian 7.0.0上的CodeBlocks 10.05开发一个C++应用程序.
由于某种原因,以下代码
#include <iostream>
std::vector< int > delaunayDiv(const std::vector< int <T> > & vP, cv::Rect boundRect,
std::vector<int>& triangles, int& numTriangles, bool lookRight);
Run Code Online (Sandbox Code Playgroud)
返回以下错误
error: 'vector' in namespace 'std' does not name a type
Run Code Online (Sandbox Code Playgroud) 有人能说出使用数组向量的正确方法是什么?
我声明了一个数组(vector<float[4]>)的向量,但error: conversion from 'int' to non-scalar type 'float [4]' requested在尝试时得到resize了.出了什么问题?
我希望能够在std :: vector和它的底层C数组int*之间进行转换,而无需显式复制数据.
std :: vector是否提供对底层C数组的访问?我正在寻找这样的东西
vector<int> v (4,100)
int* pv = v.c_array();
Run Code Online (Sandbox Code Playgroud)
编辑:
此外,是否可以进行相反的操作,即如何在std::vector不复制的情况下从C数组初始化?
int pv[4] = { 4, 4, 4, 4};
vector<int> v (pv);
Run Code Online (Sandbox Code Playgroud) 考虑以下程序,它将一系列元素插入到向量中:
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());
Run Code Online (Sandbox Code Playgroud)
这有效地复制了范围,在整个范围内为目标矢量分配了足够的空间,因此最多需要一个调整大小.现在考虑以下程序尝试将范围移动到向量中:
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));
});
Run Code Online (Sandbox Code Playgroud)
这会执行成功的移动,但不会享受insert()在目标向量中预分配空间方面的优势,因此在操作期间可以多次调整向量的大小.
所以我的问题是,是否有一个插入等效项可以将范围移动到向量中?