我遇到了以下错误.
Foo.该类的实例存储在std :: vector vec中class B.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) 我想知道我是否可以使用通用迭代器来访问向量中的元素.我有不同的向量,但只有一个功能来显示元素.如果我可以有一个通用的迭代器,那么我的方法可以顺利运行.如果有可能请提供建议.
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++ 98 vector<bool>专门化将布尔值存储为位而不是bool变量.vector<bool>的元素是不可寻址的,因为C++没有指针和对位的引用,是否有解决方法,任何明显的陷阱(我似乎都没有注意到),甚至尝试这样做是否实用?
让我们说我有一个矢量矢量:
vector< vector<int> > table;
Run Code Online (Sandbox Code Playgroud)
我知道如果没有足够的容量,矢量可以重新分配.
我想知道如果我这样做,是否有可能重新分配向量表:
table[i].resize(1000);
Run Code Online (Sandbox Code Playgroud)
表[i]的重新分配是否也可能重新分配表?
我正在寻找一种从矢量中删除重复项的方法(让我们称之为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
我想知道用另一个较小的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 :: push_back不会替换但是放大输入 - >不是我想要的
std :: vector :: insert也创建新元素并输入输入向量,但我确定向量a.size()+ b.size()<= …
我有一个我无法弄清楚的段错误问题.这是一个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) 正如标题所示,我试图使用具有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++ …
我正在尝试为OpenGL项目创建一个Wavefront(.obj)文件加载器.我正在使用的方法是逐行进行并分离矢量(std :: vectors)中的顶点位置,纹理位置和正常位置,并且我将它们的索引(顶点,纹理和法线索引)存储在三个单独的中向量(来自文件的'f'行,每个面).
我无法根据纹理索引对完整的纹理坐标进行排序.我能够将顶点渲染到正确的位置,因为我的'loader'类需要索引,但我无法弄清楚如何以任何方式对纹理坐标进行排序,因此纹理在某些三角形上看起来像是一个偏移结果.
偏移纹理的多维数据集的图像:

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

编辑:这是.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) 我把这个测试用例放在一起,用大代码重现了条件和问题。实际上,我确实需要从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()调用内发生的,“在结束后不能寻求向量迭代器” ,这对我来说没有任何意义。我确定我只是缺少一个明显的细节,但这是什么?
stdvector ×10
c++ ×8
c++11 ×2
bitvector ×1
boolean ×1
duplicates ×1
game-engine ×1
intrinsics ×1
iterator ×1
opengl ×1
replace ×1
simd ×1
unique-ptr ×1
vector ×1
wavefront ×1