标签: stdvector

std :: vector reserve方法无法分配足够的内存

我的C++应用程序中有一个缓冲类,如下所示:

class Buffer
{
    public:
    Buffer(size_t res): _rpos(0), _wpos(0)
    {
        _storage.reserve(res);
    }

    protected:
    size_t _rpos, _wpos;
    std::vector<uint8> _storage;
}
Run Code Online (Sandbox Code Playgroud)

有时使用构造函数失败,因为它无法分配所需的内存空间.例如,一次调用构造函数res = 37导致了一个段错误,其中包含我从其核心转储获得的以下堆栈跟踪:

#0  0x00007f916a176ed5 in raise () from /lib/libc.so.6
No symbol table info available.
#1  0x00007f916a1783f3 in abort () from /lib/libc.so.6
No symbol table info available.
#2  0x00007f916a1b33a8 in ?? () from /lib/libc.so.6
No symbol table info available.
#3  0x00007f916a1b8948 in ?? () from /lib/libc.so.6
No symbol table info available.
#4  0x00007f916a1bb17c in ?? () from /lib/libc.so.6
No …
Run Code Online (Sandbox Code Playgroud)

c++ linux memory-management segmentation-fault stdvector

2
推荐指数
1
解决办法
2305
查看次数

关于std :: vector :: end()的问题

我最近在以下函数中修复了一个错误,答案让我感到惊讶.我有以下功能(在我发现错误之前编写):

    void Level::getItemsAt(vector<item::Item>& vect, const Point& pt)
    {
        vector<itemPtr>::iterator it; // itemPtr is a typedef for a std::tr1::shared_ptr<item::Item>
        for(it=items.begin(); it!=items.end(); ++it)
        {
            if((*it)->getPosition() == pt)
            {
                item::Item item(**it);
                items.erase(it);
                vect.push_back(item);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

此函数查找Item"项目"向量中具有特定位置的所有对象,将其从"项目"中删除,并将它们放在"vect"中.之后,名为的函数putItemsAt执行相反的操作,并将项添加到"项".第一次通过,getItemsAt工作正常.putItemsAt但是,在调用之后,for循环getItemsAt将在'items'结束时运行.'它'将指向无效Item指针和段错误getPosition().在预感中,我改变it!=items.end()了it<items.end(),并且它起作用了.谁能告诉我为什么?环顾SO表明它可能涉及erase使迭代器无效,但它仍然没有意义,为什么它会第一次工作.

我也很好奇,因为我计划将"项目"从向量更改为列表,因为列表的擦除效率更高.我知道我必须使用!=列表,因为它没有<运算符.我会使用列表遇到同样的问题吗?

c++ stl stdvector

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

高效的类和结构的推送

我见过我的同事经常做第二个片段.为什么是这样?我已经尝试添加打印语句来跟踪ctors和dtors,但两者看起来都相同.

    std::vector<ClassTest> vecClass1;
    ClassTest ct1;
    ct1.blah = blah // set some stuff
    ...
    vecClass1.push_back(ct1);
Run Code Online (Sandbox Code Playgroud)

    std::vector<ClassTest> vecClass2;
    vecClass2.push_back(ClassTest());
    ClassTest& ct2 = vecClass2.back();
    ct2.blah = blah // set some stuff
    ...
Run Code Online (Sandbox Code Playgroud)

PS.如果标题有误导性,我很抱歉.

编辑:

首先,谢谢大家的回复.

我用了一个小应用程序std::move.结果让我感到惊讶,也许是因为我做错了...有人请解释为什么"快速"路径表现得更好.

#include <vector>
#include <string>
#include <boost/progress.hpp>
#include <iostream>

const std::size_t SIZE = 10*100*100*100;
//const std::size_t SIZE = 1;
const bool log = (SIZE == 1);

struct SomeType {
    std::string who;
    std::string bio;
    SomeType() {
        if (log) std::cout << "SomeType()" << std::endl;
    }
    SomeType(const SomeType& other) …
Run Code Online (Sandbox Code Playgroud)

c++ stl stdvector

2
推荐指数
1
解决办法
2805
查看次数

如何有效地将std :: string复制到向量中

我有一个字符串

std::string s = "Stack Overflow";
Run Code Online (Sandbox Code Playgroud)

我需要复制到矢量中.这就是我这样做的方式

std::vector<char> v;
v.reserve(s.length()+1);
for(std::string::const_iterator it = s.begin(); it != s.end(); ++it)
{
    v.push_back( *it );
}
v.push_back( '\0' );
Run Code Online (Sandbox Code Playgroud)

但我听说范围操作更有效率.所以我在想这样的事情

std::vector<char> v( s.begin(), s.end());
v.push_back('\0');
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,这样做会更好吗?插入'\ 0'时潜在的重新分配怎么样?
我想的另一种方法就是这样

std::vector<char> v(s.length()+1);
std::strcpy(&v[0],s.c_str());
Run Code Online (Sandbox Code Playgroud)

也许速度快但可能不安全?
编辑
必须是一个空终止字符串,可以在C函数内使用(读/写)

c++ stdstring stdvector

2
推荐指数
1
解决办法
1万
查看次数

std :: vector <type>的类型要求

我仍然对std::vector在C++ 11中使用的类型的要求感到困惑,但这可能是由错误的编译器(gcc 4.7.0)引起的.这段代码:

struct A {
  A() : X(0) { std::cerr<<" A::A(); this="<<this<<'\n'; }
  int X;
};

int main()
{
  std::vector<A> a;
  a.resize(4);
}
Run Code Online (Sandbox Code Playgroud)

工作正常并产生预期的输出,表明默认的ctor(显式给定)被调用(而不是隐式复制ctor).但是,如果我将删除的副本ctor添加到课程中,即

struct A {
  A() : X(0) { std::cerr<<" A::A(); this="<<this<<'\n'; }
  A(A const&) = delete;
  int X;
};
Run Code Online (Sandbox Code Playgroud)

gcc 4.7.0不编译,但尝试使用已删除的ctor.这是正确的行为还是错误?如果是前者,如何让代码工作?

c++ constructor allocation stdvector c++11

2
推荐指数
1
解决办法
2963
查看次数

OpenGL:将VBO与std :: vector一起使用

我正在尝试加载一个对象并使用VBO和glDrawArrays()来渲染它.问题是像float f[]={...}我这样的简单浮点指针不起作用,因为我传递了这个指针可以存储的值的限制.所以我的解决方案是使用矢量.而且它不起作用......

这是我的代码:

unsigned int vbo;
vector<float*> vert;

...
vert.push_back(new float(i*size));
vert.push_back(new float(height*h));
vert.push_back(new float(j*size));
...

glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vert), &vert, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
Run Code Online (Sandbox Code Playgroud)

并呈现:

glBindBuffer(GL_ARRAY_BUFFER, vbo);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, 0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
Run Code Online (Sandbox Code Playgroud)

我glBufferData()对第3个参数的位置有问题const GLvoid *data.我正在路过,&vert但它没有用.

c++ opengl pointers vbo stdvector

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

矢量迭代次数比size()

我有这段代码:

for (std::vector<Marker>::iterator it = markers.begin(); it != markers.end(); ++it) {
    if (it->getDots().size() < 3) {
        markers.erase(it);
    }
}
Run Code Online (Sandbox Code Playgroud)

在其中一个测试输入(应用程序进行图像分析)中,我得到了一个段错误.我试图调试代码(无济于事)并注意到一件事.当问gdb p markers.size()我收到$9 = 3.所以我希望循环迭代三次,但令人惊讶的是它(至少)完成了5次.在第五次迭代中有一个段错误.我还注意到,导致错误的不是*it(这里it->)的解引用.具体来说it->getDots(),这是一个简单的吸气剂.

我很少用C++编写,所以它可能是一个简单的错误,但我的调试和谷歌搜索都没有带来任何解决方案.你能帮忙吗?

我想强调的是,在各种不同的输入(略有不同的图像)上,这个功能正常工作,所以我更难以追踪到这个错误.

c++ iterator std stdvector

2
推荐指数
1
解决办法
90
查看次数

有没有更简洁的方法将std :: string组合成std :: vector <char>?

我有一些代码将各种元素组合到缓冲区中.我的代码看起来像这样:

static void CreatePacket(const std::string& source, const std::string id, const std::string payload, std::vector<char>& buffer)
{
    buffer.resize(source.size() + id.size() + payload.size());
    std::vector<char>::iterator bufferDest = buffer.begin();

    // Start the message
    char MessageStart = '$';
    *bufferDest = MessageStart;
    ++bufferDest;

    // Copy the message source
    std::copy(source.begin(), source.end(), bufferDest);
    bufferDest += source.size();

    // Copy the message id
    std::copy(id.begin(), id.end(), bufferDest);
    bufferDest += id.size();
}
Run Code Online (Sandbox Code Playgroud)

该方法调用如下:

std::vector<char> buffer;

std::string source = "AB";
std::string id = "CDE";
std::string payload = "payload";

CreatePacket(source, id, payload, buffer);
Run Code Online (Sandbox Code Playgroud)

在std …

c++ string insert std stdvector

2
推荐指数
1
解决办法
219
查看次数

模板向量<typename>迭代器的NULL /默认值

我希望将矢量迭代器作为c ++中类定义的一部分,并希望将它们初始化为固定的默认值.在指针的情况下,我会初始化为NULL,不知道应该为vector迭代器做什么.

class ball{
private:
    double x;       
    double v;   
    double timeToNext;  
    vector<ball>::iterator lball, rball;//How should they be initialized?
public:
    ball()  {   //default constructor
    x=-1*INF;
    v=0;
    cout<<"Ball added"<<endl;
    //want to initialize iterators
    }
    void setx(double &pos){x=pos;}
    void setv(double &vel){v=vel;}
    void setTimeToNext()    {
        double tl, tr;
    }
    double getx(){return x;}
    double getv(){return v;}
};
Run Code Online (Sandbox Code Playgroud)

c++ iterator stdvector

2
推荐指数
1
解决办法
151
查看次数

计算向量中大于数字的元素

我想计算大于c ++向量中元素个数的元素。阈值将从用户输入。

用于计数大于数字的元素的代码为:

ctr=count_if(v.begin(),v.end(), greater1);

对应功能:

bool greater1(int value)
{
   return value >= 8;
}
Run Code Online (Sandbox Code Playgroud)

问题是我仅在count_if函数调用之前才知道阈值(此处为8),因此我需要将阈值t作为参数传递。如何建立相同的?

c++ vector counting stdvector c++03

2
推荐指数
1
解决办法
252
查看次数