c++ - 如何使用默认值初始化固定长度的 std::pair 的 std::vector ?

标签 c++ c++11 vector

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

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 处为 true,因为我只在该位置分配了一个值。事实上,&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::pair 的 std::vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30279850/

相关文章:

c++ - 具有必须返回派生类的基类 vector 的类的下标运算符重载

c++ - 创建、显示然后访问位图/DIB 数据(w/o GetBitmapBits())

c++ - boost::asio 通过 SocketCAN

c++ - 外部符号的可见性和可移植性

c++ - 如何使用属性在 Tensorflow Lite 中添加自定义运算符

c++ - 获取 std::vector/std::array 的维数

c++ - 保存和加载 std::chrono::time_point 到文件

c++ - 重载 [][] 运算符 c++

c++ - 在 for range 循环中迭代包含 vector 的取消引用的 unique_ptr

c++ - 如何使用 C++ 进行系统调用