用C++将一个向量填充为另一个向量

5

我有两个向量,我想用第二个向量填充第一个向量。这些向量的声明如下:

vector<Vec3> firstVector;

Vec3是一个由float类型的x、y、z构成的结构体。 我尝试着使用赋值操作符来实现:

secondVector.assign(firstVector.begin(), firstVector.end());

但是它会停下来并抱怨说,存在end()的问题。
我也尝试过pushback,但当然它不起作用。
根据我之前读到的,我应该使用assign,但我不知道如何正确解决它。
编辑:
insert和assign的错误消息是相同的:
this 0x00000000 ... std::vector > * const
[size] CXX0030:错误:无法评估表达式
[capacity] CXX0030:错误:无法评估表达式
它指向Visual Studio的vector文件中的迭代器末尾返回。使用插入时,它指向迭代器开头。
代码:
第一个Vector也是结构体的一部分:
struct o3DModel
{
    vector<Vec3> v_Vertices;
};

struct Vec3 {
public:
Vec3() {}

Vec3(float X, float Y, float Z)
{
    x = X;
    y = Y;
    z = Z;
}

float x, y, z;
};

我在我的应用程序类中声明了"o3DModel"结构体,并将其发送到我的加载器类中,代码如下:

我在我的应用程序类中声明"o3DModel"结构体,并将其发送到我的加载器类中:

o3DModel *tfTable;

void TheApp::Init()
{
    objLoader->ImportOBJ(tfTable, "testcube.obj");
}

objLoader类,我在那里成功填充了我的“v_Vertices”向量,其中“oModel”是发送的“tfTable”:

bool OBJLoader::ImportOBJ(o3DModel *oModel, char *strFileName)
{
    FillObjData(oModel);
    ...
    return true;
}

void OBJLoader::FillObjData(o3DModel *oModel)
{
    oModel->v_Vertices.insert(oModel->v_Vertices.begin(), v_Vertices.begin(), v_Vertices.end());
    // This here with insert
    outFile2 << oModel->v_Vertices[0].x << "\n";
}

希望这能帮到您。

3
您的代码应该可以工作(虽然我不同意您应该“使用赋值符号做这件事”)。您能否发布您收到的确切错误消息? - Robᵩ
2
secondVector 是如何声明的,错误信息确切是什么?(另外,一个简单的 secondVector = firstVector 也会做同样的事情)。 - Mike Seymour
我发现我应该发布错误消息。我会在我的问题中编辑它。 - matthew3r
你正在取消引用一个空指针。问题不在你展示给我们的代码中,而是在你没有展示的代码中。请将你的程序缩小到最小可能的程序,仍然能够演示错误,然后将该非常小但完整的程序发布到你的问题中。有关更多信息,请参见http://sscce.org/。 - Robᵩ
如果不是整个程序,我会缩小一切并发布它。 - matthew3r
可能是快速将一个向量复制到另一个向量的方法的重复问题。 - hmofrad
5个回答

8

如果你想让secondVector获取firstVector所有的值而不添加其他值,

secondVector = firstVector;

如果您希望将firstVector的每个元素添加到secondVector的末尾:

secondVector.insert(secondVector.end(), 
                    firstvector.begin(), firstVector.end());

如果您希望将firstVector的每个元素添加到secondVector的开头:

secondVector.insert(secondVector.begin(), 
                    firstVector.begin(), firstVector.end());

有一个问题是关于begin的,但是根据你所写的,我会在问题中发布代码。 - matthew3r

4

或者如果您不想在构造函数中执行此操作,请使用

secondVector = firstVector

这段话涉及到IT技术方面的内容,建议在上下文中理解。

@Robᵩ - 是的抱歉,我在想其他事情,反正没有理由不使用'='。 - Martin Beckett

2

这应该可以正常工作:

vector<Vec3> secondVector(firstVector.begin(), firstVector.end());

当您有兴趣使用 向量构造函数 时,这就是情况。


@Robᵩ 哦...是的,确实是打错了 :). - Kiril
每次在SO帖子中看到“cplusplus.com”,我都会感到心痛。请使用cppreference.com代替。 - Griwes
@Griwes 是的,他们需要提高他们的页面排名...怪谷歌! - Kiril
@Griwes 除了 cppreference,虽然可能更正式正确,但它缺少许多简单事物的文档。不过,他们支持C++11。 - Christian Rau

1

你的第二个向量需要声明为一个 Vec3 结构体的向量的向量。

    vector<vector<Vec3>> secondVector;
    secondVector.push_back(firstVector);

-1

好的,我已经解决了,但是有点绕。在FillObjData中,我创建了一个新的Vec3,创建了一个if语句,将第一个向量的x、y、z坐标赋给新的Vec3,并将Vec3推入向量中。当我声明我的结构时,我声明它为实际值而不是指针。现在它完美地工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接