gpt4 book ai didi

c++ - 为什么需要在列表拼接功能cpp中使用列表参数

转载 作者:行者123 更新时间:2023-12-01 14:52:37 27 4
gpt4 key购买 nike

为什么在拼接函数cpp中需要列表参数?为什么仅迭代器是不够的?
如果我将l1l2作为第二个参数传递,结果是相同的l1.splice(st, l1, it, it2);l1.splice(st, l2, it, it2);
打印1 4 5 2 3

#include <bits/stdc++.h> 
using namespace std;

int main()
{


// initializing lists and iterator
list<int> l1 = { 1, 2, 3 };
list<int> l2 = { 4, 5 };

auto it = l2.begin();
auto it2 = l2.end();

auto st = l1.begin();
std::advance(st,1);

// result the same if in splice l1 or l2
// 1 4 5 2 3
l1.splice(st, l2, it, it2);

cout << "list l1 after splice operation" << endl;
for (auto x : l1)
cout << x << " ";
return 0;
}

最佳答案

这个电话

l1.splice(st, l1, it, it2);

调用未定义的行为。

当您需要提取一系列元素时,则必须更新列表的其他数据成员,例如 size

例如,如果执行此语句
std::cout << l2.size() << '\n';

您会得到意想不到的结果。

这是一个用gcc 8.3编译的演示程序。
#include <iostream>
#include <list>
#include <iterator>

int main()
{
std::list<int> lst1 = { 1, 3, 5, 7, 9 };
std::list<int> lst2 = { 0, 2, 4, 6, 8 };

lst1.splice( std::next( std::begin( lst1 ) ),
lst1,
std::begin( lst2 ),
std::end( lst2 ) );

for ( const auto &item : lst1 )
{
std::cout << item << ' ';
}
std::cout << '\n';

for ( const auto &item : lst2 )
{
std::cout << item << ' ';
}
std::cout << '\n';

std::cout << "the size of lst2 is " << lst2.size() << '\n';

return 0;
}

它的输出是
1 0 2 4 6 8 3 5 7 9 

the size of lst2 is 5

如果您在此调用中将 lst1更改为 lst2
    lst1.splice( std::next( std::begin( lst1 ) ), 
lst2, // <===
std::begin( lst2 ),
std::end( lst2 ) );

那么您将获得正确的输出
1 0 2 4 6 8 3 5 7 9 

the size of lst2 is 0
^^^

关于c++ - 为什么需要在列表拼接功能cpp中使用列表参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62101358/

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