gpt4 book ai didi

c++ - 如何初始化 std::vector of std:pair of fixed length with default values?

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

假设一个结构包含一个 std::vector 和 std::pair 类型的项。

struct block {
std::vector<std::pair<key_t, value_t>> items;
block(const Data& d) : items()
{
items = std::vector<std::pair<key_t, value_t>>(d.size_);
}
};

在代码的后面,我为位置 0 处的 vector 赋值:

block<key_t, value_t> b(*this);
std::pair<key_t, value_t> item = std::pair<key_t, value_t>(k, v);
b.items[0] = item;

在代码的后面,我想遍历 vector 并期望 &bucket_item != NULL 仅在位置 0 为真,因为我只在该位置赋值。事实上,&bucket_item != NULL 始终为真。

for (std::pair<key_t, value_t> item : b.items)
{
if (&item != NULL)
{
...
}
}

我无法像这样用 NULL 值初始化 vector :

items = std::vector<std::pair<key_t, value_t>>(d.size_, NULL);

如何解决?

最佳答案

看起来你有 Java 背景,C++ 有点不同。

items = std::vector<std::pair<key_t, value_t>>(d.size_);

items已经使用其默认构造函数进行了初始化。上面的行创建了另一个默认的初始化容器并将其分配给 items , 这是不必要的。

在:

b.items[0] = item;

你需要确保 vector 足够大,因为它不会为你在operator[]中分配元素。 .要么做b.items.push_front/back(item)或使用 vector::insert 将其插入特定位置,例如b.items.insert(b.items.begin(), item) . push_xxxinsert为新元素分配内存。

当你做的时候

for (std::pair<key_t, value_t> item : b.items) 
{
if (&item != NULL)

它遍历容器中的所有现有元素。 item按值存储(与 Java 不同)在容器中,因此它存在于非 NULL 地址并且不可能等于 NULL .

但是,表达式 for(std::pair<key_t, value_t> item : b.items)在堆栈上创建每个元素的拷贝(也在非 NULL 地址),您可能希望它是 for(std::pair<key_t, value_t>& item : b.items)仅引用元素而不是复制它(注意 items 左侧的符号)。如果您不打算修改 item在循环内部,您可能喜欢使用 const限定符以及让代码的读者清楚你的意图。例如for(std::pair<key_t, value_t> const& item : b.items) .

而且因为您使用 C++11无论如何,您不必拼出容器元素的类型,只需使用 auto :

for (auto const& item : b.items) 
// do something to item

关于c++ - 如何初始化 std::vector of std:pair of fixed length with default values?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30279850/

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