std::vector對象操作


C++Primer4

Exercise 3.13:


 

讀一組整數到 vector 對象:

(1)計算並輸出每對相鄰元素的和。如果讀入元素個數為奇數,則提示用戶最后一個元素沒有求和,並輸出其值。

(2)頭尾元素兩兩配對(第一個和最后一個, 第二個和倒數第二個, 以此類推),計算每對元素的和,並輸出。

 

Implement

 

(1)計算並輸出每對相鄰元素的和。如果讀入元素個數為奇數,則提示用戶最后一個元素沒有求和,並輸出其值。

下面是我的實現,代碼有問題,可以找找看:

#include <iostream>
#include <iomanip>
#include <time.h>
#include <string>
#include <vector>

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

int main()
{
int ival;
vector<int> ivec;
while (cin>>ival)//Ctrl+z結束
{
ivec.push_back(input);
}

for (vector<int>::size_type index=0; index!=ivec.size()-1; index+=2)
{
cout<<"ivec["<<index<<"]+ivec["<<index+1<<"]="<<ivec[index]+ivec[index+1]<<endl;
}

if (ivec.size()%2)
{
cout<<"ivec["<<ivec.size()-1<<"]="<<ivec[ivec.size()-1]<<"未進行加和"<<endl;
}

return 0;
}

是否已經找到了錯誤呢?不行就編譯運行下就能找到錯在哪了

另,《習題解答》的程序中,還增加了判斷ivec對象是否為空

 

(2)頭尾元素兩兩配對(第一個和最后一個, 第二個和倒數第二個, 以此類推),計算每對元素的和,並輸出。

這是我的實現:

    for (vector<int>::size_type index=0; index!=ivec.size()/2; index++)
{
cout<<"ivec["<<index<<"]+ivec["<<ivec.size()-index-1<<"]="
        <<ivec[index]+ivec[ivec.size()-index-1]<<endl;        
}
if (ivec.size()%2)
{
cout<<"ivec["<<(ivec.size()-1)/2<<"]="<<ivec[(ivec.size()-1)/2]<<"未進行加和"<<endl;
}

每次循環都會調用兩次ivec.size(),還有for條件判斷的一次,所以效率比較低。下面是《習題解答》的實現,整個for循環只調用一次ivec.size(),只是增加了一個vector<int>::size_type變量,代碼如下:

    for (vector<int>::size_type first=0, last=ivec.size()-1; first<last; ++first, --last)
{
cout<<"ivec["<<first<<"]+ivec["<<last<<"]="<<ivec[first]+ivec[last]<<endl;
}
if (ivec.size()%2)
{
cout<<"ivec["<<(ivec.size()-1)/2<<"]="<<ivec[(ivec.size()-1)/2]<<"未進行加和"<<endl;
}

效率明顯提升是比我的實現高多啦,要寫出高效的循環,並實現需求所要求的邏輯,真的是不容易啊。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM