标签: stdvector

向量的reserve()方法的行为

我想知道std::vector::reserve()以下情况的行为:

  1. 假设reserve(N)一个接一个地立即调用多次.早期reserve(N1)会被加起来还是被覆盖?
  2. 如果早期reserve(N1)被最新的呼叫覆盖,那么如果最新reserve(Nn)要求的插槽数量减少会怎样?
  3. 在声明vector我们是否只有push_back()X元素之后,然后我们调用reserve(N).已经有push_back()X元素会被计入N吗?
  4. 假设,如果vector有一些X推送元素,现在如果我们再增加 push_back()1个元素(X + 1),则该对象必须重新定位; 但我们还没有表演push_back().如果我们reserve()现在打电话怎么办?对象会立即重新定位吗?如果没有,那么如何保留空间?

c++ methods stdvector

6
推荐指数
2
解决办法
2352
查看次数

从数组构造向量

这表明我可以从数组构造一个向量,如下所示:

// 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)?

c++ stdvector

6
推荐指数
1
解决办法
3924
查看次数

当push_back新元素到std :: vector时,C++引用会发生变化

我不知道该怎么做 - 请告诉我下面的代码有什么问题.我修改了我的代码,将其简化为最简单的术语.有一个带有一堆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++ reference push-back stdvector c++11

6
推荐指数
1
解决办法
3766
查看次数

为什么需要std :: move来调用std :: vector的move assign运算符

我正在学习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)

结果是:

size of a before move: 3  
size of a after move: 3
Run Code Online (Sandbox Code Playgroud)

这似乎性病::向量的线,则不会调用的移动赋值运算符v = a的功能aaa,否则a将有大小为0,而不是3.
但是,如果我改变 …

c++ stdvector rvalue-reference move-semantics c++11

6
推荐指数
2
解决办法
1665
查看次数

这是在现代C++糟糕实践中使用原始指针吗?

我想要保存一个没有对象切片的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 …

c++ polymorphism smart-pointers stdvector c++11

6
推荐指数
1
解决办法
1552
查看次数

初始化由类的构造函数内的向量组成的矩阵

我正在尝试构建一个具有字符矩阵的游戏.我正在尝试使用向量向量来构建我的矩阵.我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)

c++ class stdvector

6
推荐指数
1
解决办法
314
查看次数

为什么这个函数产生不正确的值?

我有一个简单的函数模板来计算容器的平均值:

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++ templates stdvector

6
推荐指数
1
解决办法
834
查看次数

调整大小时,`std::vector` 会抛出“错误分配”异常

我在 C++ dll 中有以下代码,通过 JNI 调用它:

std::vector<double> myVector;
myVector.resize(10000000, 0);
Run Code Online (Sandbox Code Playgroud)

我收到“错误分配”异常,即使向量的最大大小据称大于 10000000。

我应该使用什么工具来跟踪内存分配,以便找到任何内存泄漏?

如果确实没有内存泄漏,我如何减少向量的占用空间以确保我有足够的空间?

c++ java-native-interface stdvector bad-alloc

5
推荐指数
1
解决办法
8044
查看次数

通过Cython(回调)将Python函数应用于std :: vector

我试图通过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)

c++ python callback cython stdvector

5
推荐指数
2
解决办法
3370
查看次数

“std::vector”的恒定时间“包含”?

我正在使用一些代码,通过将其地址与描述数据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)

我相信这是未定义的行为吗?如果是这样,有没有办法在不大幅改变代码时间复杂度的情况下做同样的事情?

c++ contains time-complexity stdvector undefined-behavior

5
推荐指数
1
解决办法
550
查看次数