【发布时间】:2020-12-25 14:17:00
【问题描述】:
我使用了相当数量的 C++,但没有那么多 std::list ..
在我当前的项目中,我需要一个std::list<..> 数据成员,并使用std::list<..>::iterator 跟踪列表中的位置。该对象也必须是可移动的,但在我的情况下,默认的移动构造函数是不可能的。这里std::list 做了一些让我吃惊的事情。
考虑
#include <list>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
template<typename T>
void test() {
T l { 1, 2, 3, 4, 5 };
cout << "l = "; for(const auto& e: l) cout << e << " "; cout << endl;
auto pos = find(l.begin(), l.end(), 6);
if (pos == l.end()) cout << "l end\n";
cout << "---- moving l > lmv ----" << endl;
T lmv { std::move(l) };
cout << "l = "; for(const auto& e: l) cout << e << " "; cout << endl;
cout << "lmv = "; for(const auto& e: lmv) cout << e << " "; cout << endl;
if (pos == l.end()) cout << "l end\n";
if (pos == lmv.end()) cout << "lmv end\n";
}
int main() {
cout << "___vector___\n";
test<vector<int>>();
cout << "___list___\n";
test<list<int>>();
}
这个输出
___vector___
l = 1 2 3 4 5
l end
---- moving l > lmv ----
l =
lmv = 1 2 3 4 5
lmv end
___list___
l = 1 2 3 4 5
l end
---- moving l > lmv ----
l =
lmv = 1 2 3 4 5
l end
即指向从lists 移动端的迭代器不指向移动到lists 端。
但它适用于vector,如果迭代器本质上是指针,这是我一直期望的。为什么list 不同?元素的内存位置不应该随着移动而改变.. lists 移动改变列表迭代器吗?为什么?
我正在使用“g++.exe(Rev1,由 MSYS2 项目构建)10.2.0” 在 Windows 10 上的 MSYS2 下
【问题讨论】:
-
当你的程序在 Visual C++ 调试模式下运行时,你的程序会以
assert()大爆炸。 -
另外,比较指向不同容器的迭代器没有意义。
-
@Someprogrammerdude 根据cppreference
std::list中的迭代器在移动后有效,std::vector的也是如此 -
虽然
end迭代器似乎有一个例外,它可以失效 -
@Daniel Langr 我会同意,如果容器实际上不同,但这是一个举动..?
标签: c++ list iterator move-semantics