gpt4 book ai didi

接受 OutputIterator 并写入它的 C++ 函数

转载 作者:太空狗 更新时间:2023-10-29 23:42:20 25 4
gpt4 key购买 nike

我正在尝试编写一个接受 OutputIterator 并将值写入其中的 C++ 函数,但我遇到了各种问题。当我传入 list<> 迭代器时,列表未填充,当我传入 vector<> 迭代器时,出现段错误(在 Linux 上)。

我关注了来自 "populating an std::[container] from a function by passing an output iterator" 的讨论和 "How to write a function that takes an iterator or collection in a generic way?" .

有什么想法吗?我想用输出容器的 begin() 调用 insertValues() 代码,就像我调用其他 STL 函数(如 std:copy())一样。

#include <cstdio>
#include <list>
#include <vector>

using namespace std;

template<typename OutputIterator>
void insertValues(OutputIterator result)
{
for (int i = 0; i < 10; i++)
{
*(result++) = i;
}
}

int main(int argc, char **argv)
{
// This code produces 0 items in the list.
list<int> values_list;
insertValues(values_list.begin());
printf("values has %d items\n", (int) values_list.size());

// This code produces a seg fault.
vector<int> values_vector;
insertValues(values_vector.begin());
printf("values has %d items\n", (int) values_vector.size());
}

最佳答案

您的代码中断了,因为列表和 vector 都没有足够的元素。请注意,输出迭代器不会添加 元素,它只是写入现有 元素。

因此,您可以按如下方式重写它:

template<typename Container>
void insertValues(Container &result)
{
for (int i = 0; i < 10; i++)
{
result.push_back(i);
}
}

并在main :

insertValues(values_list);
insertValues(values_vector);

或者,您可以使用执行 push_back 的迭代器手术。这是在名称下的标准库中 back_inserter (#include <iterator>)。使用它,而不是修改你的 insertValues代码:

insertValues(back_inserter(values_list));
insertValues(back_inserter(values_vector));

关于接受 OutputIterator 并写入它的 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4786334/

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