push_backC++中方法名称的基本原理是什么std::vector?例如,是否存在基于堆栈的原点(push是常见的堆栈操作)?是否有预先存在的库使用这些术语来添加序列?
除了常见的术语,其他API使用append和add,insert_end似乎更内部自我一致(虽然front并back在其他地方存在).
我编写了以下代码来理解移动语义.它在g ++ - 4.6中按预期工作(即没有副本,只有移动)但在g ++ - 4.7.0中没有.我认为这是链接在g ++ - 4.7.0中的一个错误,但是这个链接说它不是g ++ - 4.7中的错误.所以,正如我从上面的链接中所理解的那样,我使移动构造函数无法生成,但它仍然只复制.但是,如果我将复制构造函数设为nothrow,则只进行移动.任何人都能解释一下吗?
#include <iostream>
#include <vector>
using namespace std;
struct S{
int v;
static int ccount, mcount;
S(){}
//no throw constructor
//S(nothrow)(const S & x){
S(const S & x){
v = x.v;
S::ccount++;
}
S(S&& x){
v = x.v;
S::mcount++;
}
};
int S::ccount = 0;
int S::mcount = 0;
int main(){
vector<S> v;
S s;
for(int i = 0; i < 10; i++) {
v.push_back(std::move(s));
} …Run Code Online (Sandbox Code Playgroud) 我们的团队遇到了这里描述的相同问题http://forums.codeguru.com/archive/index.php/t-514404.html,即调用some_vec.resize(new_size),其中N = new_size - some_vec.size()N> = 2,VC10默认构建全部N新元素,而GCC默认构造一个单独的元素,作为原型元素,为新元素复制构造N次.
由于这是uuid的向量,其中default-constructor随机初始化每个新实例,我们最终得到N次与GCC相同的uuid和N个与VC不同的uuid.这足以在我们的测试套件中在一个平台上造成严重破坏而不是另一个平台,并且找到它并不好玩.
我的问题是:谁是对的?VC还是GCC?或者这是C++那些心爱的角落之一,这是未指明的?TIA,--DD
我无法弄清楚如何返回对vector元素的引用.[]和at()返回引用,不是吗?
但是当我尝试以下内容时,它将无法编译.
我使用的是Visual C++,它 不能将'const float'转换为'float& error.
T& GetElement(size_t x) const {
return _vector.at(x);
}
Run Code Online (Sandbox Code Playgroud)
GetElement是一个方法,_vector是一个成员变量.
我最近对内存(de)分配感到困惑 std::vectors
让我们假设我得到了整数的正常向量:
std::vector<int> intv;当我push_back有时int它会随着时间而增长.当我离开函数的范围(即)时,它会被释放,而不需要额外的调用.
大.让我们举另一个例子:
struct foo_t{
std::string bar:
unsigned int derp;
}
void hurr(){
std::vector<foo_t> foov;
foo_t foo;
foo.bar = "Sup?";
foo.derp = 1337;
foov.push_back(foo);
}
Run Code Online (Sandbox Code Playgroud)
好的.当我调用hurr()vector创建时,会创建一个foo_t实例,实例将被填充并推送到向量.因此,当我离开函数时,向量将被释放,内容(此处为一个foo_t)也会被释放?
下一个例子:
struct foo_t{
std::string bar:
unsigned int derp;
}
std::vector<foo_t> hurr(){
std::vector<foo_t> foov;
foo_t foo;
foo.bar = "Sup?";
foo.derp = 1337;
foov.push_back(foo);
return foov;
}
Run Code Online (Sandbox Code Playgroud)
在我的理解中,向量及其内容存在于堆栈中,它最终被时间覆盖并且我返回的向量和其内容将是无用的.或者它实际上是否返回了带有其内容副本的向量副本(如果它不是POD,则需要内容数据类型的Copy-Constructor)?
显而易见的事情:
struct foo_t{
std::string bar:
unsigned int derp;
}
std::vector<foo_t*> hurr(){
std::vector<foo_t*> foov;
foo_t …Run Code Online (Sandbox Code Playgroud) 在C++代码的开头,我初始化一个1000000(百万)bool类型数据的向量.但是,在valgrind中,最大堆+堆栈使用量显示为200Kb.鉴于Bool是1字节,不应该是1 Mb?
有没有我没有意识到的优化?或者我错过了什么?
谢谢你的提前.
我使用的是Ubuntu64 16.04系统.编译没有-O参数的代码.
编辑:代码可以简化为此,
vector<bool> * isPrime;
int main(){
isPrime = new vector<bool>(1000000, true);
}
Run Code Online (Sandbox Code Playgroud)
编辑2:似乎有一个我没有意识到的优化(在评论中说明).谢谢.
如果我尝试访问std::vector越界,将导致未定义的行为.
const std::vector<int> vec {1,2,3};
const int a = vec[4];
Run Code Online (Sandbox Code Playgroud)
然而,这段代码可能不会立即失败,但a会有一个任意值;
如果vec通过该方法访问,.at()则将抛出异常.
const int a = vec.at(4);
Run Code Online (Sandbox Code Playgroud)
缺点是,如果.at()总是使用,性能将显着下降.
我的问题是,如果某些C++编译器支持编译标志,则会切换operator []到该.at()方法.
将其打开可以获得良好的可调试代码.将其关闭会导致快速发布可执行文件.
我知道堆检查工具,比如valgrind会发现这些bug,但是它们需要花费很多时间.
如果我有类似的东西:
vector<int> longVector = { ... };
vector<int> newVector;
transform(longVector.begin(), longVector.end(), back_inserter(newVector),
[] (int i) { return i * i; });
Run Code Online (Sandbox Code Playgroud)
STL是否能够newVector在处理和添加新元素之前预先分配空间?我知道这不是算法的要求,但是"好的"实现能够优化吗?或者,对于这种情况,我newVector.reserve(longVector.size());之前应该更喜欢添加吗?我不一定要问每个stdlib实现是否存在(尽管如果有人知道特定的例子会很好),但考虑到算法的接口和要求,更多是否可能(和预期).
这个问题适用于多个STL算法transform,copy,move,fill_n,...而且不只是back_inserter,也front_inserter和inserter我想.
编辑:为了清楚起见,我的意思是一个STDLIB是否能够提供的具体实现中,例如,transform,对于情况下,当输出迭代是back_inserter的vector,在这种情况下,将访问向量的对象并保留足够的空间来存储该distance在实际运行转换之前,在给定的迭代器对之间.
C++ 14最终工作草案做出如下评论std::vector:
存储管理是自动处理的,但可以提供提示以提高效率.
矢量的存储自动处理,根据需要进行扩展和收缩.
而动态数组的维基百科条目说:
C++
std::vector和Ruststd::vec::Vec是动态数组的实现
所以我认为当一个向量的容量远大于它的大小时,它应该自动减少它的容量.我写了下面的代码来检查我的假设:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {};
cout << "initialization" << endl;
cout << " capacity: " << v.capacity() << endl;
cout << " size: " << v.size() << endl;
for (int i = 1; i <= 10000; i++)
v.push_back(i);
cout << "after inserting a lot of elements" << endl;
cout << " capacity: " …Run Code Online (Sandbox Code Playgroud) 晚上好.
我知道C风格的数组或std :: array并不比矢量快.我一直使用矢量(我使用它们很好).但是,我有一些情况,使用std :: array比使用std :: vector更好,我不知道为什么(用clang 7.0和gcc 8.2测试).
让我分享一个简单的代码:
#include <vector>
#include <array>
// some size constant
const size_t N = 100;
// some vectors and arrays
using vec = std::vector<double>;
using arr = std::array<double,3>;
// arrays are constructed faster here due to known size, but it is irrelevant
const vec v1 {1.0,-1.0,1.0};
const vec v2 {1.0,2.0,1.0};
const arr a1 {1.0,-1.0,1.0};
const arr a2 {1.0,2.0,1.0};
// vector to store combinations of vectors or arrays
std::vector<double> glob(N,0.0);
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.初始化变量的上述代码不包含在基准测试中.现在,让我们写一个函数元素(结合double …