我想知道std::vector::reserve()以下情况的行为:
reserve(N)一个接一个地立即调用多次.早期reserve(N1)会被加起来还是被覆盖?reserve(N1)被最新的呼叫覆盖,那么如果最新reserve(Nn)要求的插槽数量减少会怎样?vector我们是否只有push_back()X元素之后,然后我们调用reserve(N).已经有push_back()X元素会被计入N吗?vector有一些X推送元素,现在如果我们再增加
push_back()1个元素(X + 1),则该对象必须重新定位; 但我们还没有表演push_back().如果我们reserve()现在打电话怎么办?对象会立即重新定位吗?如果没有,那么如何保留空间?这表明我可以从数组构造一个向量,如下所示:
// the iterator constructor can be used to construct from arrays:
int myints[] = {16,2,77,29};
vector<int> myvector (myints, myints + sizeof(myints) / sizeof(int) );
Run Code Online (Sandbox Code Playgroud)
为什么构造函数的第二个参数myints + sizeof(myints) / sizeof(int)?
我不知道该怎么做 - 请告诉我下面的代码有什么问题.我修改了我的代码,将其简化为最简单的术语.有一个带有一堆MyNode对象的std :: vector.第一步是获取对这些节点之一(Data m_data)的一个数据元素的常量引用 - 在下面的示例中,在插入第二个节点之前只有一个节点,如下所示:
const cv::Data& currData = m_nodesVector[currIndex].GetData();
MyNode node(...);
m_nodesVector.push_back(node);
Run Code Online (Sandbox Code Playgroud)
正好在vector :: push_back调用中,currData的值发生了变化!我只是不明白.如何将新节点插入向量会将值引用更改为第一个节点的数据?!! 请注意,在"创建"第二个节点时,该值不会更改 - 但是在插入到std :: vector中的操作时.我的意思是,我认为std :: vector可能会重新调整一些内存,但这不应该改变引用权吗?
编译器= VS 2012
多谢你们.非常感激.
我正在学习c ++ 11,我对移动语义和右值引用有疑问.我的示例代码如下(C++ Shell URL是cpp.sh/8gt):
#include <iostream>
#include <vector>
void aaa(std::vector<int>&& a)
{
std::cout << "size of a before move: " << a.size() << std::endl;
std::vector<int> v;
v = a; /*std::move(a)*/
std::cout << "size of a after move: " << a.size() << std::endl;
}
int main ()
{
std::vector<int> foo (3,0);
aaa(std::move(foo));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果是:
Run Code Online (Sandbox Code Playgroud)size of a before move: 3 size of a after move: 3
这似乎性病::向量的线,则不会调用的移动赋值运算符v = a的功能aaa,否则a将有大小为0,而不是3.
但是,如果我改变 …
我想要保存一个没有对象切片的Base类实例的向量(这样我也可以存储没有问题的Base的子实例),同时保持多态行为,而不是通过复制值而是通过引用添加到列表中.
请考虑以下源文件:
#include <iostream>
#include <string>
#include <vector>
#include <memory>
class Entity
{
public:
Entity(){this->edited = false;}
virtual std::string name() = 0;
bool edited;
};
class Player: public Entity
{
public:
Player(): Entity(){}
std::string name(){return "player";}
};
int main()
{
std::vector<Entity*> entities;
Player p;
entities.push_back(&p);
entities.at(0)->edited = true;
Entity* ent = entities.at(0);
std::cout << "ent = " << ent->name() << ", edited = " << ent->edited << ".\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我获得以下输出:
ent = player, edited = 1.
Run Code Online (Sandbox Code Playgroud)
当输出显示(通过打印出"播放器"并显示"已编辑"中的更改)时,由于原始指针而保持多态行为,并且我能够毫无问题地编辑列表成员.
澄清我在问什么:我可以使用std …
我正在尝试构建一个具有字符矩阵的游戏.我正在尝试使用向量向量来构建我的矩阵.我game.h有这个:
#ifndef GAME_H
#define GAME_H
// includes
using namespace std;
class Game
{
private:
int row;
int col;
vector<vector<char>>* matrix;
// other atributtes
public:
Game();
~Game(){}
// some functions
};
#endif
Run Code Online (Sandbox Code Playgroud)
在我的game.cpp:
Game::Game()
{
this->col = 20;
this->row = 20;
// Initialize the matrix
this->matrix = new vector<vector<char>>(this->col);
for(int i = 0 ; i < this->col ; i++)
this->matrix[i].resize(this->row, vector<char>(row));
// Set all positions to be white spaces
for(int i = 0 ; i < this->col; …Run Code Online (Sandbox Code Playgroud) 我有一个简单的函数模板来计算容器的平均值:
template<typename T>
T array_average( std::vector<T>& values ) {
if( std::is_arithmetic<T>::value ) {
if( !values.empty() ) {
if( values.size() == 1 ) {
return values[0];
} else {
return (static_cast<T>( std::accumulate( values.begin(), values.end(), 0 ) ) / static_cast<T>( values.size() ) );
}
} else {
throw std::runtime_error( "Can not take average of an empty container" );
}
} else {
throw std::runtime_error( "T is not of an arithmetic type" );
}
}
Run Code Online (Sandbox Code Playgroud)
我在static_cast<>上面添加了s,试图强制计算到所需的类型<T>.
当我在main中调用此函数时使用 uint64_t
std::vector<uint64_t> …Run Code Online (Sandbox Code Playgroud) 我在 C++ dll 中有以下代码,通过 JNI 调用它:
std::vector<double> myVector;
myVector.resize(10000000, 0);
Run Code Online (Sandbox Code Playgroud)
我收到“错误分配”异常,即使向量的最大大小据称大于 10000000。
我应该使用什么工具来跟踪内存分配,以便找到任何内存泄漏?
如果确实没有内存泄漏,我如何减少向量的占用空间以确保我有足够的空间?
我试图通过Cython学习如何在C和Python之间使用回调,并一直在看这个演示.我想将一个Python函数应用于一个std :: vector/numpy.array并将结果存储在另一个中.我可以编译并运行没有错误,但最终矢量y没有被更改.
C++标题
// callback.hpp
#include<vector>
typedef double (*Callback)( void *apply, double &x );
void function( Callback callback, void *apply, vector<double> &x,
vector<double> &y );
Run Code Online (Sandbox Code Playgroud)
C++源码
// callback.cpp
#include "callback.hpp"
#include <iostream>
using namespace std;
void function( Callback callback, void* apply,
vector<double> &x, vector<double> &y ) {
int n = x.size();
for(int i=0;i<n;++i) {
y[i] = callback(apply,x[i]);
std::cout << y[i] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
Cython标题
# cy_callback.pxd
import cython
from libcpp.vector cimport vector
cdef extern from "callback.hpp":
ctypedef …Run Code Online (Sandbox Code Playgroud) 我正在使用一些代码,通过将其地址与描述数据std::vector范围的地址进行比较,检查是否在恒定时间内包含给定元素。vector然而我怀疑,虽然它有效,但它依赖于未定义的行为。如果该元素不包含在 中,vector则不允许进行指针比较。
bool contains(const std::vector<T>& v, const T& a) {
return (v.data() <= &a) && (&a < v.data() + v.size());
}
Run Code Online (Sandbox Code Playgroud)
我相信这是未定义的行为吗?如果是这样,有没有办法在不大幅改变代码时间复杂度的情况下做同样的事情?