尝试将代码简化为基于范围的 for 循环以进行移动语义时,与"运算符 []"不匹配

no match for ‘operator[]' when trying to simplify code into range-based for-loop for move semantics

本文关键字:语义 移动 不匹配 运算符 循环 for 代码 于范围 范围      更新时间:2023-10-16

我试图减少和简化我的代码的大小,但遇到了这个错误:

BucketSort.cpp: In member function ‘void BucketSort::sort(unsigned int)’:
BucketSort.cpp:118:34: error: no match for ‘operator[]’ (operand types are ‘std::vector<unsigned int> [10]’ and ‘std::vector<unsigned int>’)
         std::move(std::begin(vecs[i]), std::end(vecs[i]), std::back_inserter(numbersToSort));
                                  ^
BucketSort.cpp:118:53: error: no match for ‘operator[]’ (operand types are ‘std::vector<unsigned int> [10]’ and ‘std::vector<unsigned int>’)
         std::move(std::begin(vecs[i]), std::end(vecs[i]), std::back_inserter(numbersToSort));
                                                     ^
make: *** [BucketSort.o] Error 1
Ivans-MacBook-Pro:CS6771A5-ParallelBucketSort ivanteong$

我试着从:

numbersToSort = std::move(vecs[0]); // bucket containing 0 (handle case where there is a number that is 0)
    std::move(std::begin(vecs[1]), std::end(vecs[1]), std::back_inserter(numbersToSort));
    std::move(std::begin(vecs[2]), std::end(vecs[2]), std::back_inserter(numbersToSort));
    std::move(std::begin(vecs[3]), std::end(vecs[3]), std::back_inserter(numbersToSort));
    std::move(std::begin(vecs[4]), std::end(vecs[4]), std::back_inserter(numbersToSort));
    std::move(std::begin(vecs[5]), std::end(vecs[5]), std::back_inserter(numbersToSort));
    std::move(std::begin(vecs[6]), std::end(vecs[6]), std::back_inserter(numbersToSort));
    std::move(std::begin(vecs[7]), std::end(vecs[7]), std::back_inserter(numbersToSort));
    std::move(std::begin(vecs[8]), std::end(vecs[8]), std::back_inserter(numbersToSort));
    std::move(std::begin(vecs[9]), std::end(vecs[9]), std::back_inserter(numbersToSort));

到基于范围的for循环:

for (auto i : vecs) {
    std::move(
        std::begin(vecs[i]),
        std::end(vecs[i]),
        std::back_inserter(numbersToSort)
    );
}

我的。h文件中的声明如下:

std::vector<unsigned int> numbersToSort;
std::vector<unsigned int> vecs[10] = {
    std::vector<unsigned int>(),
    std::vector<unsigned int>(),
    std::vector<unsigned int>(),
    std::vector<unsigned int>(),
    std::vector<unsigned int>(),
    std::vector<unsigned int>(),
    std::vector<unsigned int>(),
    std::vector<unsigned int>(),
    std::vector<unsigned int>(),
    std::vector<unsigned int>()
};

有谁知道是怎么回事吗?

我觉得你想要的更多:

for (auto& vec : vecs) {
    std::move(
        std::begin(vec),
        std::end(vec),
        std::back_inserter(numbersToSort)
    );
}

基于范围的for循环不扩展索引,而是扩展一个真正的变量,或者,使用auto&而不是auto,引用给定容器的内容。