gpt4 book ai didi

c++ - 关于STL的进展

转载 作者:行者123 更新时间:2023-11-28 00:42:22 26 4
gpt4 key购买 nike

函数 advance() 的定义是:

template<class InIt, class Dist>
void advance(
InIt& it,
Dist n
);

当我在我的代码中使用这个函数时:

string strArr[10];
strArr[0] = string("dd");
strArr[1] = string("gg");
strArr[2] = string("tt");
const vector<string> vecStr(strArr, strArr+6);
advance(vecStr.begin(), 2);
cout<<*(vecStr.begin())<<endl; // the output is dd

你知道函数 advance() 中的第一个参数是引用,所以在 advance(vecStr.begin(), 2); 之后 , verStr.begin() 应该指向 vecStr[2]。但是从输出中我们发现 vecStr.begin() 指向 str[0]

我想知道为什么?

最佳答案

advance(vecStr.begin(), 2);
cout<<*(vecStr.begin())<<endl; // the output is dd

您正在使用两个不同的迭代器,其中一个用于 advance,另一个用于打印。

要使您的代码正常工作,请使用 advancecout 在同一个迭代器上

auto iter = vecStr.begin();
advance(iter , 2);
cout << *iter << endl;

只是在您的原始代码中添加注释,advance(vecStr.begin(), 2); 实际上不会编译,至少如果您使用严格的编译器设置。 vecStr.begin() 返回一个临时对象,该对象不能绑定(bind)到 std::advance 的第一个参数,它是一个左值引用。


此外,std::vector::begin()逻辑上返回 vector 内实际开始迭代器的拷贝,而不是对它的引用。这意味着您对返回的迭代器所做的任何操作都不会反射(reflect)到 vector 内的 begin 迭代器。我在这里谈论的是迭代器,而不是它们指向的元素。

关于c++ - 关于STL的进展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18158538/

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