尝试将代码简化为基于范围的 for 循环以进行移动语义时,与"运算符 []"不匹配
no match for ‘operator[]' when trying to simplify code into range-based for-loop for move semantics
我试图减少和简化我的代码的大小,但遇到了这个错误:
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
,引用给定容器的内容。
相关文章:
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 可以使用移动语义更改或改进此C++代码吗?
- c++在使用指针时移动语义
- 使用移动和复制语义时函数匹配如何工作?
- 移动语义和深层/浅层复制之间有什么关系?
- 了解构造函数在移动、复制、赋值语义中的行为
- std::unique_lock移动语义
- 移动语义和运算符 + 重载
- C++ 移动语义是否在任何情况下都能节省资源?
- 移动语义在这里如何工作?
- 使用移动语义:右值引用作为方法参数
- 在C++中使用移动语义的正确方法是什么?
- 移动语义 c++ 单链表
- C++:使用整数移动语义
- 当变量和参数名称匹配时,移动语义构造失败
- 在 C++11 中移动语义
- 方法冗余移动调用的移动语义
- 视觉理解移动C++标准的语义
- 如何通过move语义移动多个参数