C++;入门第5版练习3.24-向量中的迭代器 我刚刚开始学习LIPPMAN,LaJoe&Mo的C++底漆第五版(第五印刷,2014年5月),2014年9月我自己学习C++。那本书中的一些练习我可以做,一些我不得不在这里寻求帮助,而这一次我被困了好几天。我搜索了谷歌、博客和其他论坛,但一无所获,所以我向你寻求帮助。第113页的练习3.24要求与第105页的练习3.20相同,但使用迭代器:

C++;入门第5版练习3.24-向量中的迭代器 我刚刚开始学习LIPPMAN,LaJoe&Mo的C++底漆第五版(第五印刷,2014年5月),2014年9月我自己学习C++。那本书中的一些练习我可以做,一些我不得不在这里寻求帮助,而这一次我被困了好几天。我搜索了谷歌、博客和其他论坛,但一无所获,所以我向你寻求帮助。第113页的练习3.24要求与第105页的练习3.20相同,但使用迭代器:,c++,vector,iterator,C++,Vector,Iterator,将一组整数读入向量。打印每对相邻元素的总和。更改程序,使其打印第一个和最后一个元素的和,然后是第二个和第二个到最后一个元素的和,依此类推 按照要求使用迭代器,我可以完成第一部分: #include <iostream> #include <vector> using std::cin; using std::cout; using std::endl; using std::vector; int main() { vector<int> lista

将一组整数读入向量。打印每对相邻元素的总和。更改程序,使其打印第一个和最后一个元素的和,然后是第二个和第二个到最后一个元素的和,依此类推

按照要求使用迭代器,我可以完成第一部分:

#include <iostream>
#include <vector>

using std::cin; using std::cout; using std::endl; using std::vector;

int main()
{
   vector<int> lista;
   int num_entra = 0;

   while (cin >> num_entra)
       lista.push_back(num_entra);


   cout << "Sum of adjacent pairs: " << endl;
   for (auto it = lista.begin(); it != lista.end() - 1; ++it)
   {
       *it += *(it + 1);
       cout << *it << ' ';
   }

   return 0;
}
#包括
#包括
使用std::cin;使用std::cout;使用std::endl;使用std::vector;
int main()
{
向量lista;
int num_entra=0;
而(cin>>数量)
lista.向后推(num_entra);

cout一种方法是使用两个迭代器

auto front = lista.begin();  // start at front and increment
auto back = lista.end() - 1; // start at back and decrement
for (;
     back > front;     // stop when the iterators cross each other
     ++front, --back)
{
    int total = *front + *back;
    std::cout << total << ' ';
}
auto-front=lista.begin();//从前面开始并递增
auto back=lista.end()-1;//从后面开始并递减
对于(;
back>front;//当迭代器相互交叉时停止
++前,——后)
{
整数总计=*前+后;

std::coutMy five cents。只需输入值,而不是显式初始化的向量

#include <iostream>
#include <vector>

int main() 
{
    std::vector<int> v = { 1, 2, 3, 4, 5 };

    if ( !v.empty() )
    {
        auto first = v.cbegin(), last = v.cend();
        do
        {
            std::cout << *first + *--last;
        } while ( first++ != last );
    }

    return 0;
}
这种方法也可以用于
std::list

如果需要跳过中间的奇数元素,那么对于没有随机访问迭代器的容器,一般的方法如下

#include <iostream>
#include <vector>

int main() 
{
    std::vector<int> v = { 1, 2, 3, 4, 5 };

    for ( auto first = v.cbegin(), last = v.cend(); 
          first != last && first != --last;
          ++first )
    {
        std::cout << *first + *last;
    }

    std::cout << std::endl;

    return 0;
}

代码的问题在于,在通过解引用迭代器计算和时修改了向量(这可能不是问题,但可能是不必要的副作用),并且在“超过”向量的中间时,甚至没有停止循环

一个简单的版本可以是

auto front = lista.begin();
auto back = lista.end() - 1;
for (; back > front; ++front, --back)
{
    int total = *front + *back;
    std::cout << total << ' ';
}
auto front = lista.begin();
auto back = lista.end() - 1;
for (; back >= front; ++front, --back)
{
    if (front == back)
        cout << *front;
    else {
        int total = *front + *back;
        std::cout << total << ' ';
    }
}
但这不会处理空列表
[]

此解决方案可以同时处理这两个问题,尽管它更为复杂:

auto it = lista.begin();
    auto ult = lista.rbegin();
    size_t dist;
    for ( ; it != lista.end() && // I have a valid front iterator
            ult != lista.rend() && // I have a valid back iterator
            (dist = std::distance(it,ult.base()), dist) > 0; // Their distance is greater than 0 (1 is included)
    ++it,++ult ) {
        if (dist == 1)
            cout << *it;
        else
            cout << *it + *ult << ' ';
    }
autoit=lista.begin();
auto-ult=lista.rbegin();
大小距离;
对于(;it!=lista.end()&&&//我有一个有效的前迭代器
ult!=lista.rend()&&&//我有一个有效的反向迭代器
(dist=std::distance(it,ult.base()),dist)>0;//它们的距离大于0(包括1)
++it,++ult){
if(dist==1)

cout除了递增一个迭代器而递减另一个迭代器外,我认为最好的方法是使用反向迭代器

auto it = list.begin();
auto rit = list.rbegin(); // a "reverse iterator"
while (it < rit.base()) {
  cout << *it++ + *rit++ << ' ';
}
autoit=list.begin();
auto rit=list.rbegin();//一个“反向迭代器”
而(它cout这里还有一种方法,
mid
是最接近数组中间的迭代器,它也常用于二进制搜索实现:

  auto e = lista.end() - 1;
  auto mid = lista.end() + (lista.begin() - lista.end()) / 2;
  for (auto i = lista.begin(); i != mid; ++i, --e){
    cout << *i << "+" << *e << " = " << (*i)+(*e) << endl;
  }

另外,我建议您检查向量是否为空。

非常感谢!它成功了!我不知道您可以在for循环之外声明迭代器,并让一个为空“;”在它里面。@Opa Opa在这种特殊情况下,在循环之外声明迭代器是一个坏主意。此外,如果向量为空,代码将不起作用。@VladfromMoscow在这种情况下,它是微不足道的,因为它们随后立即从
main
返回;)您正确地认为应该在o防止空列表,他们应该决定如何处理奇数长度列表(只需返回中间元素?将中间元素添加到自身?其他内容?)。我建议
while(back-->front++)
。在我看来,它看起来更好。@black我不知道是什么“->”意思是:我在C++入门的第3章,还没有学会这个特性。谢谢!我还没有学习反向迭代器,很高兴知道还有这个选项!我用了你的代码,注意到当配对是奇数时它会做额外的运算。进入“1 2 2 3 4”,给出“6 6 6”而不是“6 6”。.为什么?如果有奇数个元素,它会将中间的元素添加到自身中。例如,1+5、2+4和3+3。这对我来说似乎是明智的…否则它应该只打印3?还是什么都不打印?哦,我知道了。谢谢。我更喜欢在奇数个元素的情况下不打印任何内容。这本书教了这个“中间”方法,但当我尝试使用此方法进行此练习时,我无法理解它,并遇到了许多编译错误,因此我放弃了,并尝试了其他方法。很高兴知道如何使其工作!它需要两个迭代器。谢谢!另外,如果我不想在奇数元素的情况下求和,我只需将“I!=mid-1”。太好了!我不想打印奇数元素,但谢谢你的解释!我正在做笔记。处理空列表的解决方案现在离我的理解有点远。@Opa Opa不是问题,只是要注意这个问题,也许以后再回到这段代码,它会更容易理解谢谢!就像这是我想做的代码,但是如何让奇数元素被忽略呢?我还没有学习STD::列表。列出了<使用 s的要点是什么,你不妨使用整个命名空间并用它完成。我只是遵循C++的入门风格。我只是在新文件中复制和粘贴标题。这不是吗?是否比使用整个名称空间更安全?请注意,如果向量为空,那么您为练习的第一部分编写的代码将无法工作
auto front = lista.begin();
auto back = lista.end() - 1;
for (; back >= front; ++front, --back)
{
    if (front == back)
        cout << *front;
    else {
        int total = *front + *back;
        std::cout << total << ' ';
    }
}
auto it = lista.begin();
    auto ult = lista.rbegin();
    size_t dist;
    for ( ; it != lista.end() && // I have a valid front iterator
            ult != lista.rend() && // I have a valid back iterator
            (dist = std::distance(it,ult.base()), dist) > 0; // Their distance is greater than 0 (1 is included)
    ++it,++ult ) {
        if (dist == 1)
            cout << *it;
        else
            cout << *it + *ult << ' ';
    }
auto it = list.begin();
auto rit = list.rbegin(); // a "reverse iterator"
while (it < rit.base()) {
  cout << *it++ + *rit++ << ' ';
}
  auto e = lista.end() - 1;
  auto mid = lista.end() + (lista.begin() - lista.end()) / 2;
  for (auto i = lista.begin(); i != mid; ++i, --e){
    cout << *i << "+" << *e << " = " << (*i)+(*e) << endl;
  }
 /*Output*/
 1+9 = 10
 2+8 = 10
 3+7 = 10
 4+6 = 10
 5+5 = 10