gpt4 book ai didi

c++ - 为什么 std::make_move_iterator 适用于 vector 但不适用于 vector

转载 作者:可可西里 更新时间:2023-11-01 17:07:43 25 4
gpt4 key购买 nike

我期待 std::make_move_iterator总是会 move 内容,但似乎不会。

看起来是在vector<string>中 move 元素但不在vector<int> .

请看下面的代码片段:

#include <iostream>
#include <iterator>
#include <string>
#include <vector>

void moveIntVector()
{
std::cout << __func__ << std::endl;
std::vector<int> v1;
for (unsigned i = 0; i < 10; ++i) {
v1.push_back(i);
}
std::vector<int> v2(
std::make_move_iterator(v1.begin() + 5),
std::make_move_iterator(v1.end()));
std::cout << "v1 is: ";
for (auto i : v1) {
std::cout << i << " ";
}
std::cout << std::endl;

std::cout << "v2 is: ";
for (auto i : v2) {
std::cout << i << " ";
}
std::cout << std::endl;
}

void moveStringVector()
{
std::cout << __func__ << std::endl;
std::vector<std::string> v1;
for (unsigned i = 0; i < 10; ++i) {
v1.push_back(std::to_string(i));
}
std::vector<std::string> v2(
std::make_move_iterator(v1.begin() + 5),
std::make_move_iterator(v1.end()));
std::cout << "v1 is: ";
for (auto i : v1) {
std::cout << i << " ";
}
std::cout << std::endl;

std::cout << "v2 is: ";
for (auto i : v2) {
std::cout << i << " ";
}
std::cout << std::endl;
}

int main()
{
moveIntVector();
moveStringVector();
return 0;
}

结果是:

moveIntVector
v1 is: 0 1 2 3 4 5 6 7 8 9 # I expect this should be `0 1 2 3 4` as well!
v2 is: 5 6 7 8 9
moveStringVector
v1 is: 0 1 2 3 4
v2 is: 5 6 7 8 9

我在 Ubuntu 14.04, gcc 4.8.2并且代码是用 -std=c++11 编译的

你能解释为什么吗 std::make_move_iteratorvector<int> 上有不同的行为和 vector<string> ? (或者这是一个错误?)

最佳答案

该行为是预期的。从两个 vector move 后,原始 v1 的后半部分有 5 个移出的元素。

不同的是,当字符串 move 时,留下的是空字符串。这是因为它是一种非常有效的 move 字符串的方式,并使 move 后的字符串处于自洽状态(从技术上讲,它们可以保留值 "Hello, World, nice move!",但这会产生额外的费用)。最重要的是,您在输出中看不到那些移出的字符串。

对于 int vector ,没有办法比复制它更有效地 move int,所以它们只是被复制过来。

如果您检查 vector 的大小,您会看到 v1 在这两种情况下的大小都是 10。

这里有一个简化的例子来说明从字符串中移出的是空的:

#include <iostream>
#include <iterator>
#include <string>
#include <vector>

int main()
{
std::vector<std::string> v1{"a", "b", "c", "d", "e"};
std::vector<std::string> v2(std::make_move_iterator(v1.begin()),
std::make_move_iterator(v1.end()));

std::cout << "v1 size " << v1.size() << '\n';
std::cout << "v1: ";
for (const auto& s : v1) std::cout << s << " - ";
std::cout << '\n';

std::cout << "v2 size " << v2.size() << '\n';
std::cout << "v2: ";
for (const auto& s : v2) std::cout << s << " - ";
std::cout << '\n';
}

输出:

v1 size 5
v1: - - - - -
v2 size 5
v2: a - b - c - d - e -

关于c++ - 为什么 std::make_move_iterator 适用于 vector<string> 但不适用于 vector<int>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25009351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com