std::vector 与 C++ 中的原始数组有多相似?
Posted
技术标签:
【中文标题】std::vector 与 C++ 中的原始数组有多相似?【英文标题】:How similar is an std::vector to a raw array in C++? 【发布时间】:2010-10-21 23:39:43 【问题描述】:我正在写一个刽子手游戏。我的逻辑和我的游戏逻辑都失败了。字符猜测(人们猜测的字母)没有被添加到向量guessArray 的正确内存槽中。假设该词是用户输入的词。
如果guessArray 是一个原始数组,我认为这会起作用。是否有某种原因这不适用于矢量?
//assume that attempts is num of attempts left
void coutWord(int attempts, std::string word, char guess)
std::vector<char> guessArray(word.length());
//this is supposed to add the guess to the correct area of guessArray;
//It's not.
for (int i = 0; i < word.length(); i++)
if (guess == word[i])
guessArray[i] = guess;
std::cout << " " << guessArray[i] << " ";
continue;
std::cout << " _ ";
std::cout << std::endl << std::endl;
编辑:我使用此代码的目标是在同一个 for 循环中找出所有未猜测的空格和猜测的空格。我只需要“记住”以前的猜测,以便得到正确的输出。给定单词 =“苹果酱”:
Input: a
a _ _ _ _ _ a _ _ _
Input: p
a p p _ _ _ a _ _ _
等等。
【问题讨论】:
无论guessArray 是向量还是原始数组,这似乎都是相当有缺陷的代码。为了能够回答您的问题,您需要说出您在这里尝试做什么。 EG,如果单词是“Triangulate”,猜测是“g”,输出应该是什么? 那么我应该将向量作为另一个参数传递吗? 根据您的函数,您还需要遍历所有先前的猜测,因为您没有在调用之间保存guessArray。你可能想把它作为另一个参数传入,是的。 【参考方案1】:向量可以用下标符号[]
进行索引,并且它存储在连续的内存中。它是一个 STL 容器,因此就像数组一样,您可以拥有任何类型。
矢量会自动调整大小。数组是“静态”大小的,不能轻易调整大小(调用 realloc 的手动函数除外。)您可以使用 push_back 函数来处理此问题,也可以提前 .reserve() 内存来保存重新分配。
数组不跟踪它自己的大小,而向量具有可以检查这一点的函数。
如果您不确定向量的大小,请继续使用 .push_back() 添加项目以处理自动调整大小的问题。如果您通过 resize() 保留一块内存然后对其进行索引,则它更容易用作数组,但您会失去将其用作动态大小的对象的一些语法优势。
【讨论】:
如果你 .reserve() 一块内存,在技术上索引它是不正确的。 Reserve() 函数不会改变向量的概念大小。在这种情况下使用的函数是 resize()。很常见的错误。【参考方案2】:除了使用向量或数组之外,您的代码中存在基本的逻辑缺陷。
您在这里尝试执行两项任务:
更新猜测数组 输出猜测数组当您尝试在一个函数中完成这两项任务时,很容易混淆。我给你的建议是把它们放到不同的函数中。
这是一个基本的代码结构(使用您可以实现的函数):
int attempts = 0;
std::vector<char> guessArray(word.length());
while( (attempts > maxAttemps) && (!HasFoundWord(guessArray) )
char guess = InputGuess();
UpdateResults(guessArray, guess, word);
OutputGuess(guessArray);
++attempts;
UpdateResults 的函数签名如下:
void UpdateResults(std::vector<char>& guessArray, char guess, const std::string& word)
一旦您分离出各个功能,您会发现问题更容易解决。
【讨论】:
【参考方案3】:编辑答案:
guessArray 向量是在函数中本地创建的,因此,之前插入向量中的内容将无法用于下一次尝试。您需要通过引用传递向量并为每次尝试更新向量。
void coutWord(std::vector<char>& guessArray, int attempts, std::string word, char guess)
伪代码:
void coutWord(std::vector<char>& guessArray, int attempts, std::string word, char guess)
for (int i = 0; i < word.length(); i++)
if (guess == word[i])
//its current guess
//insert and display as well
guessArray[i] = guess;
std::cout << " " << guessArray[i] << " ";
//Check if the previous attempt has already inserted the char ( previous guess)
else if(guessArray[i] != 0)
//display previous guess too
std::cout << " " << guessArray[i] << " ";
else
//not yet guessed
std::cout << " _ ";
std::cout << std::endl << std::endl;
在外面定义向量:
std::vector<char> guessArray(word.length());
coutWord(guessArray, 1, word, 'a');
【讨论】:
【参考方案4】:我很惊讶还没有人提到它,但 std::vector 不是数组。它是一个调整大小的连续元素容器,可用于许多与数组相同的目的。如果您想要一个包装数组(并且有很多原因),您应该查看boost::array
【讨论】:
【参考方案5】:你应该使用 push_back() 函数。详情请见cpprefererence.com。
此外,您不能简单地将guessArray 替换为C 样式的数组,因为您需要使用编译时已知的常量明确指定其大小,例如
int guessArray[25];
【讨论】:
以上是关于std::vector 与 C++ 中的原始数组有多相似?的主要内容,如果未能解决你的问题,请参考以下文章
Java 使用数组比 C++ 中的 std::vector 快 8 倍。我做错了啥?
c++ 数组与 std::vector 和 std::array 的效率
如何在不循环的情况下将数组的内容复制到 C++ 中的 std::vector?
C++ 将预先保留的哈希映射(std::unordered_map)与整数键和连续数据数组(std::vector)进行比较