【发布时间】:2015-10-21 21:00:09
【问题描述】:
我正在尝试遍历多个std::lists,并对它们中的每一个进行排序。这是天真的方法:
#include<list>
using namespace std;
int main(void){
list<int> a,b,c;
for(auto& l:{a,b,c}) l.sort();
}
生产
aa.cpp:5:25: error: no matching member function for call to 'sort'
for(auto& l:{a,b,c}) l.sort();
~~^~~~
/usr/bin/../lib64/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_list.h:1586:7: note:
candidate function not viable: 'this' argument has type 'const
std::list<int, std::allocator<int> >', but method is not marked const
sort();
^
/usr/bin/../lib64/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_list.h:1596:9: note:
candidate function template not viable: requires 1 argument, but 0 were
provided
sort(_StrictWeakOrdering);
^
1 error generated.
我是否正确猜测大括号初始化器正在创建这些列表的副本?有没有办法不复制它们,并使它们在循环内可修改? (除了列出指向它们的指针之外,这是我目前的解决方法)。
【问题讨论】:
-
有点丑,但也许
for (auto l : {&a, &b, &c}) l->sort(); -
@Quentin,initializer_list 是原始
a,b,c的副本列表。因此,即使我们可以获得非const引用,它也不会很有用。我们需要一个存储引用的 initializer_list(或类似容器)。我认为这是不可能的,除非您构建自己的容器(或者使用 Boost 中的容器)
标签: c++ c++11 initializer-list