【问题标题】:Filling a vector with a custom defined class through pointers - trouble with constructor通过指针用自定义类填充向量 - 构造函数的问题
【发布时间】:2012-10-17 15:14:37
【问题描述】:

我感兴趣:

  • 具有指向用户定义类型/类的指针的 std::vector
  • 以最快的方式填充此向量

我想解决这个问题:

  • while + 迭代器(非 C++11 解决方案)
  • for_each 迭代 + lambda(c++11 解决方案)

现在在阅读文档后,我正在尝试使用 iterator 部分和 while

#include <iostream>
#include <vector>

class A{
  public:
    A(){}
    ~A(){}
  private:
    int n;
    double d;
    float f;
    std::string s;
};

int main(){
  std::vector<A*> v(100); // fixed *A to A*
  std::vector<A*>::iterator iter = v.begin(); // fixed *A to A*
  while( iter != v.end() )
  {
    *iter = new A(); // iter = A(); by the way this does not works either // now fixed using new
    ++iter;
  }
  return(0);
}

我知道这是微不足道的,但对我来说不是,在我的理解中它是一个指针,需要间接指向它在向量中指向的实际值;显然这个概念不适合这种方式。

对于 lambda 和 for_each,我只是不知道如何为自定义定义的类使用构造函数,因为文档只讨论泛型方法和函数,而且似乎我不能使用构造函数。

如何使用迭代器和 lambda 构建对象?

另外,当我需要在整个地方执行相同的操作而不使用whilefor_eachfor 的迭代方法时,还有一种更快的方法来循环整个向量。

我想避免复制构造函数的开销,所以我想使用指针来保留所有可能的解决方案。

谢谢。

【问题讨论】:

  • 难怪它不起作用,你的星号放错地方了。它应该是std::vector&lt;A*&gt;,而不是std::vector&lt;*A&gt;。您还试图将临时对象分配给指针。
  • @SethCarnegie 我讨厌自己:D

标签: c++ vector constructor lambda iterator


【解决方案1】:

首先您应该使用A* 而不是*A 在C++ 中创建指针,其次您不能设置指向使用A() 在堆栈中创建的实例的指针,而是应该在堆上创建值或使用堆栈中变量的地址,所以你应该有*iter = new A()

【讨论】:

  • 其实是一样的,只不过是一个函数,应该接收一个项目并初始化它:std::for_each(v.begin(), v.end(), [](A*&amp; p) {p = new A();});
  • 并且知道你不应该讨厌自己,因为你从计算机编程世界中最好、最强大的语言中学到了新东西:-)
  • 谢谢,但我的编译器抱怨方括号中缺少一些参数,所以 p 是对指向 A 的指针的引用?一个指向指针的指针?
  • 首先这是一个没有捕获的 lambda,因此它在 [] 之间不需要任何内容​​,其次它是对指针的引用,而不是指向指针的指针,您应该知道在 C++ 引用中是语言的强大功能,但在实现中是的,它被实现为指针,这是一个不同的讨论。对我们来说,它是对指针的引用,这就是我们所需要的!!
  • 我忘记为我的编译器添加 C++11 标志,这不是一个好日子...谢谢,您的解决方案现在有效:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多