标签: stdvector

向量相关的内存分配问题

我遇到了以下错误.

  • 我上课了Foo.该类的实例存储在std :: vector vec中class B.
  • 在类Foo中,我通过使用new和删除该对象来分配内存来创建类A的实例~Foo().

代码编译,但我在运行时崩溃了.如果我delete my_a从类的desstructor中禁用Foo.代码运行正常(但会有内存泄漏).

有人可以解释这里出了什么问题并建议修复?

谢谢!

class A{
      public:
          A(int val);
          ~A(){};
          int val_a;

};

A::A(int val){
       val_a = val;
       };

class Foo {      
      public:
             Foo();
             ~Foo();
             void createA();
             A* my_a;
};

Foo::Foo(){
    createA();
};

void Foo::createA(){
    my_a = new A(20);
};

Foo::~Foo(){
    delete my_a;

};



class B {
      public:
             vector<Foo> vec;             
             void createFoo();            
             B(){};
             ~B(){};
};


void B::createFoo(){
    vec.push_back(Foo());
};


int …
Run Code Online (Sandbox Code Playgroud)

c++ stdvector

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

用于访问向量的通用迭代器

我想知道我是否可以使用通用迭代器来访问向量中的元素.我有不同的向量,但只有一个功能来显示元素.如果我可以有一个通用的迭代器,那么我的方法可以顺利运行.如果有可能请提供建议.

Point2,Point3,Line2,Line3是4个不同的类.该方法接受我在另一个方法中创建的向量对象.

template <typename VecObject>
void Display(VecObject v) {

    if (filterCriteria == "Point2") {
        vector<Point2>::iterator it;
    } else if (filterCriteria == "Point3") {

    } else if (filterCriteria == "Line2") {

    } else if (filterCriteria == "Line3") {

    }

    for ( it = v.begin(); it!=v.end(); ++it) {
        cout << *it << endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我以前做的更早,它的工作找到.我现在需要使用迭代器来实现

//for (int i = 0; i < v.size(); i++) {
// cout << v[i];
// }
Run Code Online (Sandbox Code Playgroud)

c++ iterator stdvector

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

vector <bool>如何处理引用和迭代器?

我们都可能知道C++ 98 vector<bool>专门化将布尔值存储为位而不是bool变量.vector<bool>的元素是不可寻址的,因为C++没有指针和对位的引用,是否有解决方法,任何明显的陷阱(我似乎都没有注意到),甚至尝试这样做是否实用?

c++ boolean proxy-classes bitvector stdvector

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

矢量向量是否可以重新分配,因为其中一个元素被重新分配?

让我们说我有一个矢量矢量:

vector< vector<int> > table;
Run Code Online (Sandbox Code Playgroud)

我知道如果没有足够的容量,矢量可以重新分配.
我想知道如果我这样做,是否有可能重新分配向量表:

table[i].resize(1000);
Run Code Online (Sandbox Code Playgroud)

表[i]的重新分配是否也可能重新分配表?

c++ stdvector

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

从不可排序的向量中删除重复项

我正在寻找一种从矢量中删除重复项的方法(让我们称之为theGreatVector:D).我不能使用std :: sort后跟std :: unique,因为无法对对象进行排序.

vector<Item*>theGreatVector 包含一些(smallVectors)

我有一个==的重载因为vector<Item*>我可以使用它

我能用O(n²)创建东西,但我需要时间效率(theGreatVector.size()可能是10⁵或10⁶)

现在我得到的是类似的东西(只有当smallOne不在其中时才填充我的向量):

for(i=0;i<size;i++)
{
  vector<Item*>smallOne = FindFacets(i)
  if(smallOne doesnt belong to GreatOne) // this line already in O(n) :/
  {
     theGreatOne.push_back(smallOne);
  }
}
Run Code Online (Sandbox Code Playgroud)

如果有一种方法可以做到这一点,即使在nlog(n)+ n或任何低于n²的东西,那就太好了!

非常感谢

AZH

c++ duplicates stdvector

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

用更小的std :: vector替换std :: vector的一部分

我想知道用另一个较小的std :: vector替换(覆盖)给定std :: vector"input"的一部分的正确方法是什么?我确实保持原始矢量的其余部分保持不变.此外,我不需要打扰原始矢量中的内容,之后我不再需要保留较小的矢量.

说我有这个:

std::vector<int> input = { 0, 0, 1, 1, 2, 22, 3, 33, 99 };
std::vector<int> a = { 1, 2, 3 };
std::vector<int> b = { 4, 5, 6, 7, 8 };
Run Code Online (Sandbox Code Playgroud)

我希望实现这一目标:

input = { 1, 2, 3, 4, 5, 6, 7, 8, 99}
Run Code Online (Sandbox Code Playgroud)

做正确的方法是什么?我想到了类似的东西

input.replace(input.beginn(), input.beginn()+a.size(), a);
Run Code Online (Sandbox Code Playgroud)

//中间输入看起来像这样:input = {1,2,3,1,2,22,3,33,99};

input.replace(input.beginn()+a.size(), input.beginn()+a.size()+b.size(), b);
Run Code Online (Sandbox Code Playgroud)

必须有一个标准的方法来做到这一点,不是吗?到目前为止,我对此的看法如下:

  • 我不能使用std :: vector :: assign来破坏输入的所有元素
  • std :: vector :: push_back不会替换但是放大输入 - >不是我想要的

  • std :: vector :: insert也创建新元素并输入输入向量,但我确定向量a.size()+ b.size()<= …

replace vector stdvector c++11

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

unique_ptr的向量是什么?

我有一个我无法弄清楚的段错误问题.这是一个EntityManager我正在努力的小型游戏引擎.我可以添加Ship Entity,并且Ship可以添加1 Bullet Entity,但如果我尝试添加超过1,则会出现段错误Bullet.我一直试图在过去的一天里把这个想象成现实.以下是实际代码的一小段摘录.

#include <vector>
#include <memory>

struct EntityManager;
struct Entity {
    Entity(EntityManager* manager) : manager(manager) { }
    virtual ~Entity() { }
    virtual void update() = 0;

    EntityManager* manager;
};
struct EntityManager {
    void update() {
        for (auto& entity : entities) {
            entity->update();
        }
    }
    void add(Entity* e) {
        entities.emplace_back(e);
    }
    std::vector<std::unique_ptr<Entity>> entities;
};
struct Bullet : public Entity {
    Bullet(EntityManager* manager) : Entity(manager) { printf("Bullet ctor\n"); }

    virtual void update() override …
Run Code Online (Sandbox Code Playgroud)

c++ segmentation-fault stdvector game-engine unique-ptr

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

使用具有SIMD内部数据类型的STL向量

正如标题所示,我试图使用具有SIMD内在数据类型的STL向量.我知道由于加载/存储的潜在开销,这不是一个好习惯,但我遇到了一个非常奇怪的错误.这是代码:

#include "immintrin.h"
#include <vector>
#include <stdio.h>

#define VL 8

int main () {
    std::vector<__m256> vec_1(10);
    std::vector<__m256> vec_2(10);

    float * tmp_1 = new float[VL];
    printf("vec_1[0]:\n");
    _mm256_storeu_ps(tmp_1, vec_1[0]); // seems to go as expected
    for (int i = 0; i < VL; ++i)
        printf("%f ", tmp_1[i]);
    printf("\n");
    delete tmp_1;

    float * tmp_2 = new float[VL];
    printf("vec_2[0]:\n");
    _mm256_storeu_ps(tmp_2, vec_2[0]); // segmentation fault
    for (int i = 0; i < VL; ++i)
        printf("%f ", tmp_2[i]);
    printf("\n");
    delete tmp_2;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我用它编译了它g++ …

simd intrinsics segmentation-fault stdvector c++11

5
推荐指数
0
解决办法
791
查看次数

如何根据Wavefront(.obj)文件中给出的纹理索引对纹理位置进行排序?

我正在尝试为OpenGL项目创建一个Wavefront(.obj)文件加载器.我正在使用的方法是逐行进行并分离矢量(std :: vectors)中的顶点位置,纹理位置和正常位置,并且我将它们的索引(顶点,纹理和法线索引)存储在三个单独的中向量(来自文件的'f'行,每个面).

我无法根据纹理索引对完整的纹理坐标进行排序.我能够将顶点渲染到正确的位置,因为我的'loader'类需要索引,但我无法弄清楚如何以任何方式对纹理坐标进行排序,因此纹理在某些三角形上看起来像是一个偏移结果.

偏移纹理的多维数据集的图像:

IMG

纹理(.png)的图像,它应该如何在每张脸上:

IMG

编辑:这是.obj文件和.mtl文件的链接. Google云端硬盘.

这是我的OBJLoader.cpp文件:

    rawObj.open(filePath); // Open file

    while (!rawObj.eof()) {
        getline(rawObj, line); // Read line

        // Read values from each line 
        // starting with a 'v' for 
        // the vertex positions with
        // a custom function (gets the word in a line
        // at position i)

        if (strWord(line, 1) == "v") {   
            for (int i = 2; i <= 4; i++) {
                std::string temp;
                temp = strWord(line, i);
                vertexStrings.push_back(temp);
            }

        // Same for texture …
Run Code Online (Sandbox Code Playgroud)

c++ opengl stdvector wavefront

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

std :: copy失败,“结束后无法寻找向量迭代器”

我把这个测试用例放在一起,用大代码重现了条件和问题。实际上,我确实需要从POD结构的C数组中进行复制,但是我希望将目标作为向量,以便它可以自行处理复制删除。

TEST_METHOD(std_copy)
{
    struct W { long a; int b; char c; char d; };
    W block[1] = { { 15, 42, 'D', 'X' } };
    std::vector<W> dest;
    dest.reserve(1);
    std::copy(block, block+1, dest.begin());
    Assert::AreEqual(42, dest[0].b);
}
Run Code Online (Sandbox Code Playgroud)

断言似乎是在dest.begin()调用内发生的,“在结束后不能寻求向量迭代器” ,这对我来说没有任何意义。我确定我只是缺少一个明显的细节,但这是什么?

c++ stdvector

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