简而言之,问题是以下两种说法是否等价:
const std::vector<std::vector<int>>和
const std::vector<const std::vector<int>>因为,在下面的2个代码中,第一个代码不能编译!
#include <vector>
long findMaxSum(const std::vector<const std::vector<int>>& vecs) {
}
int main() {
std::vector<std::vector<int>> stacks(10,std::vector<int>(10)); //yeah yeah I know stacks is evil!
for (auto& stack : stacks) {
for (auto& elem : stack) {
elem = 4;
}
}
auto t = findMaxSum(stacks);
return 0;
}#include <vector>
long findMaxSum(const std::vector<std::vector<int>>& vecs) {
}
int main() {
std::vector<std::vector<int>> stacks(10,std::vector<int>(10));
for (auto& stack : stacks) {
for (auto& elem : stack) {
elem = 4;
}
}
auto t = findMaxSum(stacks);
return 0;
}发布于 2020-09-08 13:37:22
它们并不完全相同,但对此你真的无能为力。
正如您已经发现的,尝试使用const元素创建vector通常会失败。
您可以将外部集合设置为std::array--它对其包含的元素没有严格的要求,因此std::array<const std::vector<whatever>, SIZE>是完全合适的。
另一种可能是将指针向量传递给常量向量:
// receive a vector of pointers to const vectors:
int findMaxSum(std::vector<const std::vector<int> *> &outer) {
std::vector<int> sums;
std::transform(outer.begin(), outer.end(),
std::back_inserter(sums),
[](auto v) { return std::accumulate(v->begin(), v->end(), 0); });
return *std::max_element(sums.begin(), sums.end());
}
int main() {
const std::vector<int> a {1, 2};
const std::vector<int> b {3, 4};
// pass only the address of each of the component vectors:
std::vector<const std::vector<int> *> c { &a, &b};
std::cout << findMaxSum(c) << "\n";
}这有一个额外的好处,那就是避免复制每个分量向量,只是为了将其传递给函数。如果分量向量很大,这可能是一个重要的考虑因素。
https://stackoverflow.com/questions/63786972
复制相似问题