簡體   English   中英

在 C++ 中迭代包含指針的向量

[英]Iterating over a vector containing pointers in c++

我有一個函數接受指向 rapidjson::Value 類型的指針,並將該位置的項目存儲到 kArrayType 類型的 rapidjson::Value 中。

void addBlock(rapidjson::Value* block) {
    blocksArray.PushBack(*block, allocator);
}

此功能按預期工作。

為了擴展這一點,我想添加一個函數,該函數可以將這些指針的向量作為輸入。 我試過這樣做:

void addBlocks(std::vector<rapidjson::Value*> blocks) {
    for (const rapidjson::Value& block : blocks) {
        blocksArray.PushBack(*block, allocator);
    }
}

但是,這不起作用。 它在 Visual Studio 中給了我兩個紅色波浪。

函數參數聲明中塊下方的第一個,說:

C++ 不存在合適的構造函數來轉換為...

在對PushBack()的調用中 * 下面的第二個說:

C++ 沒有運算符匹配這些操作數操作數類型是:* const rapidjson::Value

我的猜測是我正在做一些我只是想念的非常基本的錯誤。

看來你正在做一個副本,那么為什么不使用一些標准算法呢?

void addBlocks(std::vector<rapidjson::Value*> blocks) {
    std::transform(
        blocks.begin(),
        blocks.end(),
        std::back_inserter(blocksArray),
        [](rapidjson::Value* ptr){ return *ptr; });
}

您的矢量包含指針。 這些不能自動轉換為引用。 循環變量需要是指針的引用:

for (rapidjson::Value *& block : blocks)
{
     blocksArray.PushBack(*block, allocator);
}

可以肯定的是,這就是“自動”在幕后所做的(如果編譯器沒有完全優化它的話)。

不確定它是否允許您保留“常量”。 當我用整數嘗試這個時它沒有。

您可以使用auto關鍵字迭代塊向量:

for (auto block : blocks) { 
   ... 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM