【问题标题】:Which constructor of std::vector is used in this case在这种情况下使用 std::vector 的哪个构造函数
【发布时间】:2011-01-27 04:35:41
【问题描述】:

这看起来很简单,但我很困惑:我创建一百个向量的方式,比如说,ints 是

std::vector<int>  *pVect = new std::vector<int>(100);

但是,查看 std::vector 的 documentation 我发现它的构造函数是这样的

explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );

那么,前一个是如何工作的? new 是否使用从默认构造函数获得的初始化值调用构造函数?如果是这样的话,会

std::vector<int, my_allocator> *pVect = new std::vector<int>(100, my_allocator);

我在哪里传递我自己的分配器,也可以吗?

【问题讨论】:

  • 另外,如果您能推荐一个涵盖new 和ctors 的这些方面的在线资源,那就太好了。谢谢。
  • 抱歉,我不知道new 与您的问题有什么关系。
  • 基本上,我想知道的是:new 不只是打电话给 ctor 吗?但在这种情况下,这种形式没有 ctor。
  • 你为什么要创建临时文件?为什么不直接说 std::vector v(100);
  • 抱歉,我在我的问题中遗漏了news,经过编辑以将它们放入。@Neil,在你的情况下,不是只用一个参数调用 ctor,100?但是没有那种确切形式的向量 ctor,所以我想知道初始化值是否是从默认 ctor 在幕后获得的。

标签: c++ stl stdvector


【解决方案1】:

为了(也许)澄清:

创建一个名为 v 的 100 个元素的矢量对象:

std::vector <int> v( 100 );

这使用将大小(100)作为第一个参数的向量构造函数。创建一个包含 100 个元素的动态分配向量:

std::vector <int> * p = new std::vector<int>( 100 );

它使用完全相同的构造函数。

【讨论】:

  • 谢谢,我原来的帖子有些乱码,现在更正一下。我的问题是:我怎么知道可以跳过构造函数的其他第三个参数,因为向量ctor实际上有三个参数?而且,为什么可以跳过第二个和第三个参数(使用默认值)而不仅仅是第二个?谢谢。
  • 这些参数可能由于“默认参数构造”而被跳过:const T& value= T(), const Allocator& = Allocator()
【解决方案2】:

你做错了。如果您只需要当前范围和时间的向量,只需将其创建为自动对象即可

std::vector<int> pVect(100);

构造函数具有第二个和第三个参数的默认参数。所以它可以用一个 int 来调用。如果你想传递一个自己的分配器,你必须传递第二个参数,因为你不能跳过它

std::vector<int, myalloc> pVect(100, 0, myalloc(some_params));

一个专门的例子可以说明问题

void f(int age, int height = 180, int weight = 85);

int main() { 
  f(25); // age = 25, height and weight taken from defaults.
  f(25, 90); // age=25, height = 90 (oops!). Won't pass a weight!
  f(25, 180, 90); // the desired call.
}

【讨论】:

  • 我的问题是:为什么在第一种情况下可以跳过第二个参数而不是第二个?为什么 ctor 不像在第一种情况下那样处理第二个值?
  • @recipriversexclusion:第二个和第三个参数都有默认参数,因此您可以使用一个、两个、三个参数调用构造函数。如果你想将一个参数传递给第三个参数,你还需要将一个参数传递给第二个参数(编译器怎么会知道你的意思是“跳过第二个参数并将这个值传递给第三个参数?”)。
  • @recip 因为它不会自行做出任意决定。参数传递的工作原理是使参数和参数的位置相等,而不是它们的类型相等。想象一下,您创建了一个float 的向量,并且您的分配器可以通过一个 int(转换)来创建。然后在vector&lt;float, myalloc&gt; v(10, 5) 中,编译器不能只说“不是将 5 作为要创建的 10 个元素的默认值传递给第二个参数,而是将其传递给第三个参数,将其转换为分配器”。那是行不通的。那你怎么能清楚地表达你的愿望呢?
  • Johannes,在您的示例中,所有参数都具有相同的类型,因此编译器无法推断出您所说的 f(25, 90);但是,在vector的ctor中它们都是不同的,那么为什么编译器不知道我跳过了哪个参数并将其替换为默认值?
  • 哦,我明白了,你已经回答了我的问题。詹姆斯和约翰内斯,这很有帮助,非常感谢您的回答。
【解决方案3】:

您正在创建一个包含一百个元素的 vector。正如您在发布的第二个代码示例中看到的那样:

显式向量 ( size_type n, const T& 值= T(), 常量分配器& = 分配器());

此构造函数获取要放入vector 和avalue 的元素数量,这将被插入向量n 次。如果您未指定value,则使用向量类型T 的默认构造函数构造value。这里它将是int 的“默认”构造函数,它将其初始化为0(没有int 的默认构造函数之类的东西,但是C++ 标准说int 在这种情况下被初始化为0)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多