【问题标题】:My functions for a vector don't seem to be working? C++ (adding or deleting an item, displaying a vector)我的矢量功能似乎不起作用? C++(添加或删除项目,显示矢量)
【发布时间】:2014-07-27 05:34:18
【问题描述】:

我正在根据我的教科书做一个练习,让我创建一个程序,该程序允许用户通过添加、删除或查看向量中的项目来管理最喜欢的游戏列表。我利用了函数;我的程序运行,但功能似乎没有做他们应该做的。我可以为 addGame() 输入游戏名称,但是当我在 do/while 循环中输入 4 时,没有打印任何向量。同样,removeGame() 函数似乎不起作用,因为如果我输入不在列表中的游戏,它不会显示任何消息。

没有显示是哪个功能的问题?两者或只有一个(addGame 或 dispGames)?为什么我的 removeGame 功能不起作用?

感谢您的帮助。

// exercises ch 4.cpp : main project file.

#include "stdafx.h"
#include<iostream>
#include<string>
#include<vector>
#include<iterator>

using namespace std;

void addGame(vector<string> faveGames);
void removeGame(vector<string> faveGames);
void dispGames(vector<string> faveGames);



int main(array<System::String ^> ^args)
{
vector<string> faveGames;
int choice;

cout << "Welcome to the Favorite Games List program!\n\n";

do
{

    cout << "What would you like to do?\n\n";
    cout << "1 - End program. \n 2 - Add new game to list. \n 3 - Remove game from list. \n 4 - Display list. \n";
    cout << "Enter the corresponding number of your choice: ";
    cin >> choice;
switch (choice)
{
case 1: cout << "Ending program.\n"; break;
case 2: addGame(faveGames) ; break;
case 3: removeGame(faveGames); break;
case 4: dispGames(faveGames); break;
default: "That is not a valid response, please try again.";
}
}
while(choice != 1);

return 0;

}

void addGame(vector<string> faveGames) {

string newFaveGame;
cout << "Enter the name of the game you want to add: ";
cin >> newFaveGame;
faveGames.push_back(newFaveGame);

}

void removeGame(vector<string> faveGames) {

vector<string>::iterator deletedGameIter;
string deletedGame;

cout << "Enter the name of the game you want to delete: ";
cin >> deletedGame;

for(deletedGameIter = faveGames.begin(); deletedGameIter != faveGames.end(); ++deletedGameIter) {

if(deletedGame == *deletedGameIter) {
    faveGames.erase(deletedGameIter);
}
else
{
    cout << "That game is not on your list.\n";
}
}

}

void dispGames(vector<string> faveGames) {

vector<string>::iterator iter;
for(iter = faveGames.begin(); iter != faveGames.end(); ++iter)
{
    cout << *iter << endl;
}

}

【问题讨论】:

  • 你应该使用deletedGameIter-&gt;compare(deletedGame) == 0 不是你的问题,而是一些有趣的建议。
  • 在你的函数中通过引用发送向量,你现在是按值发送它们,所以你可能没有修改任何东西。
  • @Ben,不,不是std::string。这只会让阅读变得更加困难。
  • 这甚至不是 C++。是 C++/CLI 还是 C++/CX,请正确重新标记问题。

标签: string function vector iterator c++-cli


【解决方案1】:

主要问题:

您正在按值传递faveGames。对faveGames 的任何更改都不会更改main 中的变量。

如果您希望更改在main 中可见,则需要通过引用传递它们:

void addGame(vector<string>& faveGames);
void removeGame(vector<string>& faveGames);

您的代码中还有其他问题需要清理。

问题

你有

int main(array<System::String ^> ^args)

这不是标准的 C++ 代码。您使用的是 Microsoft 托管 C++ 吗?

问题

你有

faveGames.erase(deletedGameIter);

removeGame。此时,deletedGameIter 是一个无效对象。增加它会导致未定义的行为。您可以将该函数中的 for 循环更改为:

for(deletedGameIter = faveGames.begin();
    deletedGameIter != faveGames.end();
     ++deletedGameIter) {

   if(deletedGame == *deletedGameIter) {
       faveGames.erase(deletedGameIter);
       return
   }
}

如果您不希望在列表中多次看到该游戏。如果您希望多次看到它,您可以使用:

for(deletedGameIter = faveGames.begin();
    deletedGameIter != faveGames.end(); ) {

   if(deletedGame == *deletedGameIter) {
       deletedGameIter = faveGames.erase(deletedGameIter);
   }
   else {
      ++deletedGameIter;
   }
}

【讨论】:

  • 哦,伙计,我记得学习过。呸!非常感谢!我真的很感激。
  • @izaheichou:除非你的向量很大,否则将它们按值传递给函数,从函数返回新向量,然后将返回值分配给faveGames。
  • @eswarp25 为什么?要添加原因吗?
  • @Praetorian 它只是让调试和测试更容易。你可以单独测试一个函数。
  • @eswarp25,你不能通过引用传递?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多