【问题标题】:C++ Fill a vector with another vectorC++ 用另一个向量填充一个向量
【发布时间】:2012-04-12 07:45:45
【问题描述】:

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

vector<Vec3> firstVector;

其中 Vec3 是具有浮点 x、y、z 的结构。 我试过用 assign 喜欢这个:

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

但它停止并抱怨 end() 有问题。 我也尝试过推回,但它当然不起作用。

正如我之前阅读的那样,我应该用assign来做,但我不知道如何正确解决它。

编辑:

insert和assign的错误信息是一样的:

这个 0x00000000 ... std::vector > * const

[size] CXX0030:错误:无法评估表达式
[容量] CXX0030:错误:无法评估表达式

它指向Visual Studio的向量文件,以迭代器结束返回。使用 insert 它指向迭代器开始。

代码:

第一个 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 *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";
}

希望这会有所帮助。

【问题讨论】:

  • 你的代码应该可以工作(尽管我不同意你“应该用assign来做”)。您能发布您收到的确切错误消息吗?
  • secondVector 是如何声明的,错误信息到底是什么? (另外,一个简单的secondVector = firstVector 也会做同样的事情)。
  • 我知道我应该发布错误消息。我用它编辑我的问题。
  • 您正在取消引用 NULL 指针。问题不在于您向我们展示的代码,而在于您没有向我们展示的代码。请将您的程序缩减为仍然显示错误的最小程序,然后将该非常小的完整程序发布到您的问题中。请参阅sscce.org 了解更多信息。
  • 如果不是完整的程序,但我会减少所有内容并发布它。

标签: c++ vector


【解决方案1】:

如果您希望 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 有问题,但正如你所写,我会在问题中发布代码。
【解决方案2】:

或者,如果您不想在 ctor 中执行此操作,请使用

secondVector = firstVector

【讨论】:

  • @Robᵩ - 是的抱歉是别的东西,反正没有理由不使用'='
【解决方案3】:

这应该可行:

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

当您有兴趣使用vector constructor 时就是这种情况。

【讨论】:

  • @Robᵩ 啊...是的,确实是错字:)。
  • 每当我在 SO 帖子中看到“cplusplus.com”时,我都会感到心痛。请改用 cppreference.com。
  • @Griwes 是的,他们需要提高他们的页面排名...怪 Google!
  • @Griwes 除了 cppreference,虽然可能在形式上更正确,但缺少许多简单事物的文档。不过,它们支持 C++11。
【解决方案4】:

您的第二个向量需要声明为 Vec3 结构向量的向量。

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

【讨论】:

    【解决方案5】:

    好的,我已经解决了,但是要绕一个小环。在 FillObjData 中,我创建了一个新的 Vec3,创建了一个 if,将第一个向量 x、y、z 坐标赋予新的 Vec3,并将 Vec3 推入向量中。当我声明我的结构时,我已经声明它不是指针。现在它完美地工作了。

    【讨论】:

      猜你喜欢
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      相关资源
      最近更新 更多