gpt4 book ai didi

c++ - 有效地初始化具有初始值的 vector

转载 作者:搜寻专家 更新时间:2023-10-31 02:19:55 25 4
gpt4 key购买 nike

给定此类型进行测试:

struct Counter
{
static int count;

Counter(int)
{
count++;
}

Counter(const Counter&)
{
count++;
}

Counter(Counter&&) noexcept
{

}
};

int Counter::count = 0;

假设我们有以下内容:

std::vector<Counter> vec(5, 0);

根据 VS2015,创建了 6 个 Counter 对象。我知道只有 5 个永久对象。为什么编译器不放置构​​造函数参数中的对象,或者将临时对象移动到第一个位置,然后从中复制其余部分?

即使将 vector 的初始大小设置为 0,仍会创建 1 个对象。

std::vector<Counter> vec(0, 0);

如果大小直到运行时才知道并且通常为 0(无操作)并且容器中的类型复制或构造成本很高,这可能很重要。

在一条语句中初始化 vector 通常很方便,尤其是当它们是初始化列表中的类成员或常量时。我怎样才能像下面的代码那样高效地做到这一点:

std::vector<Counter> vec;
vec.reserve(size);
for (size_t i = 0; i < size; i++)
{
vec.emplace_back(0);
}

它只构造与存储在 vector 中的对象一样多的包含对象。

最佳答案

您可以简单地定义一个函数,以您想要的方式创建 vector 。

作为函数,初始化代码是异常安全的。

#include <iostream>
#include <vector>
#include <stddef.h> // ptrdiff_t
#include <utility> // std::forward
using namespace std;

struct Counter
{
static int n_constructor_calls;

Counter( int )
{
++n_constructor_calls;
}

Counter( Counter const& )
{
++n_constructor_calls;
}

Counter( Counter&& ) noexcept
{
++n_constructor_calls;
}
};

int Counter::n_constructor_calls = 0;

//--------------------------------------

using Size = ptrdiff_t;
using Index = Size;

template< class Item, class... Args >
auto make_vector( Size const n, Args&&... args )
-> vector<Item>
{
vector<Item> result;
result.reserve( n );
for( Index i = 0; i < n; ++i )
{
result.emplace_back( forward<Args>( args )... );
}
return result;
}

auto main() -> int
{
auto vec = make_vector<Counter>( 5, 42 );
cout << Counter::n_constructor_calls << " constructor calls.\n";
}

(这会输出“5 个构造函数调用。”)

您基本上会问,为什么没有定义 vector 构造函数来执行此操作,

Why doesn't the compiler emplace the objects from the constructor parameters, or move the temporary object into the first position and then copy the rest from it?

一个原因是这个构造函数是在 C++11 中引入移动语义之前定义的。

引入额外的构造函数(这会改变重载行为)或改变现有构造函数的行为,相对于现有的 C++ 代码库来说成本很高,因为它非常大。

关于c++ - 有效地初始化具有初始值的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33335659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com