gpt4 book ai didi

c++ - 访问指针 vector

转载 作者:搜寻专家 更新时间:2023-10-31 01:35:35 29 4
gpt4 key购买 nike

这是一个 CS 作业。我看过类似的问题/问题,但似乎找不到答案。

一些背景信息:我们需要对列表中的 C 字符串进行排序,并计算每个单词出现的次数。问题所需:编写程序 Problem2_A.cpp,从键盘输入几行文本作为 C 字符串,并打印文本中每个单词的字母顺序列表及其出现次数。为此,在指针数组中保留指向每个单词的指针。使用 qsort() 函数对指针数组进行排序,然后统计每个单词出现的次数。通过从键盘发出文件结束信号来终止输入。忽略任何大小写差异(例如,“Cat”和“cat”是同一个词)。作为最低要求,您可以假设没有标点符号,并且只有一个空格将输入行中的单词分隔开。您可以作为扩展删除此限制。

编辑-我知道我需要让用户输入一行和一堆单词。现在,我将手动输入每个单词,因为我更关心访问 vector 和检索我想要检索的内容。

这是我目前的情况

Word.H

#pragma once
#ifndef __WORD_H__
#define __WORD_H__
#define _CRT_SECURE_NO_WARNINGS

class Word {
public:
Word(char * word);

~Word();

/* Returns the inputted word */
const char* getWord();

private:
char word[51];
};

#endif

Word.cpp

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include "Word.h"

Word::Word(char * word) {
strcpy(this->word, word);
}

Word::~Word() {

}

const char* Word::getWord() {
char* clone = new char[50];
strcpy(clone, word);
return clone;
}

问题2.cpp

#include <iostream>
#include <vector>
#include "Word.h"

using namespace std;

const int MAX_WORDS = 2;
const int MAX_WORD_LENGTH = 15;

char* promptWord();


int main() {
char inputWord[MAX_WORD_LENGTH];
vector<Word*> pWordList;
pWordList.reserve(MAX_WORDS);

cout << "Please type each word and press enter: ";

for (int i = 0; i < MAX_WORDS; i++) {
Word* newWord = new Word(promptWord());
pWordList.push_back(newWord);
}

cout << "Printing &pWordList[i]" << endl;
for (size_t i = 0; i < pWordList.size(); i++) {
cout << &pWordList[i] << endl;
}

cout << "Printing (void*)pWordList[i]->getWord()" << endl;
for (size_t i = 0; i < pWordList.size(); i++) {
cout << (void*)pWordList[i]->getWord() << endl;
}

cout << "Printing pWordList[i]->getWord()" << endl;
for (size_t i = 0; i < pWordList.size(); i++) {
cout << pWordList[i]->getWord() << endl;
}

cout << "Printing (*pWordList[i]).getWord()" << endl;
for (size_t i = 0; i < pWordList.size(); i++) {
cout << (*pWordList[i]).getWord() << endl;
}

/* Delete our dynamic objects */
while (!pWordList.empty()) {
delete pWordList.back();
pWordList.pop_back();
}




system("pause");
return 0;
}

/*
Ask the user to enter their desired word
@params inputWord[MAX_WORD_LENGTH] -> Desired word to be inputted
@return Returns the user's inputted word
*/
char* promptWord() {
char inputWord[MAX_WORD_LENGTH];
cin.getline(inputWord, MAX_WORD_LENGTH);
return inputWord;
}

我不太擅长使用指针,但如果我没有理解错的话,我目前拥有的是一个指针 vector ,指向我动态分配的 Word 对象的位置。

我的部分困惑可能来自这个问题——我是否需要将对象放入指针 vector 中?或者我是否创建指向对象的指针并将这些指针放入指针 vector 中?

无论如何,如您所见,我正在尝试找出输出单词的正确方法。当我称它为

cout << &pWordList[i] << endl;

这会输出每个字的位置地址(字的指针?)。使用

cout << (void*)pWordList[i]->getWord() << endl;

将输出不同的位置(指向 vector 索引的指针?)

并使用

cout << pWordList[i]->getWord() << endl;

cout << (*pWordList[i]).getWord() << endl;

将打印出相同的垃圾。

我很可能做错了,因为

pWordList[i]->getWord()

应该打印出有问题的 c 字符串,但我认为它在传输过程中丢失了某个地方并且指针位置变得无效。真的会提供任何建议或意见。

Edit2-- 正如 Colin Basnett 和 T33C 所指出的,我已将函数更改为

/*
Ask the user to enter their desired word
@return Returns new dynamic char containing inputted word
*/
char* promptWord() {
char* inputWord = new char[MAX_WORD_LENGTH];
cin.getline(inputWord, MAX_WORD_LENGTH);
return inputWord;
}

现在我可以输出正确的东西了。仍然想知道来自两个不同的位置 &pWordList[i]和 (void*)pWordList[i]->getWord()

Edit3-- 这是我的方法,其中包含我的非工作 map 。它应该对 vector 进行排序并创建一个包含单词(实际上是指向单词的指针)及其出现次数的映射。但是,它只是对其进行排序。它打印出出现次数为 1 的每个单词,即使同一个单词被输入多次也是如此。这是因为它实际上是将指向单词的指针而不是单词本身插入到关键部分。

void measureVector(vector<Word*> ourVector, int numOfElements) {
int count = 0;
bool isDone = false;
qsort(&ourVector[0], ourVector.size(), sizeof(Word*), wordCompare);

map<Word*, int> wordCount;
for (int i = 0; i < ourVector.size(); i++) {
wordCount[ourVector[i]]++;
}

for (auto const& wc : wordCount) {
cout << wc.first->getWord() << " appears " << wc.second << " times." << endl;
}

}

我试过改变

for (int i = 0; i < ourVector.size(); i++) {
wordCount[ourVector[i]]++;
}

for (int i = 0; i < ourVector.size(); i++) {
wordCount[ourVector[i]->getWord()]++;
}

然而,这给出了一个错误说明

'[': no operator found which takes a right-hand operand of type 'const char *' (or there is no acceptable conversion)

Edit4——我再次给我的教授发了邮件,看看是否创建一个字符串映射并将 char* 转换为一个字符串,他说我可以,所以这里是更新的 measureVector 方法,以防其他人在关注它。

/*
Sorts our vector of pointers and puts all words into a map and
keeps track of each word's occurrence.
@params inputVector -> The vector of pointers to utilize.

*/
void measureVector(vector<Word*> inputVector) {
/* Sort our vector of pointers */
qsort(&inputVector[0], inputVector.size(), sizeof(Word*), wordCompare);
map<string, int> wordCount;
string ourString;

/* For each word in our vector, insert it into our map. */
for (auto word : inputVector) {
ourString = word->getWord();
wordCount[ourString]++;
}

/* For each unique word in our map, print out the word and how many times it occurred.*/
for (const auto &p : wordCount) {
cout << p.first << " appears " << p.second << " time" << (p.second > 1 ? "s." : ".") << endl;
}
}

谢谢大家的指导!

最佳答案

这段代码中有很多问题,但你的问题的关键是你正在返回一个指向堆栈上缓冲区的指针,该缓冲区在函数返回后不再存在。函数返回展开他们的栈帧。

char* promptWord() {
char inputWord[MAX_WORD_LENGTH];
cin.getline(inputWord, MAX_WORD_LENGTH);
return inputWord;
}

我犹豫要不要说在堆上声明缓冲区并返回指向它的指针,因为整个代码与现代 C++ 应有的位置相去甚远。

我推荐使用:

  1. std::string 并返回它而不是 char*
  2. 永远不要在智能指针(或保证调用 delete 的东西)之外使用 new,请参阅 std::unique_ptr,但 std::string 在您的情况下将是更好的选择。

祝你学业顺利。

关于c++ - 访问指针 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37080809/

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