首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何不让我的堆栈溢出?

如何不让我的堆栈溢出?
EN

Stack Overflow用户
提问于 2017-01-23 18:02:52
回答 3查看 113关注 0票数 1

我希望输出:

acej

这在此算法中工作得很好,但在输出结果时存在问题,该问题会导致堆栈溢出。

我该如何修复它?

代码语言:javascript
运行
复制
#include <iostream>
#include <vector>

std::vector<char> charAt(std::vector<char> str)
{
    std::vector<char> result;
    result.resize(str.size());

    for (int i = 0; i < str.size(); i++)
    {
        if (i % 2 == 0)
        {
            for (int j = 0; j < str.size(); j++)
            {
                if (result[j] == '\0')
                {
                    result[j] = str[i];
                    break;
                }
            }
        }
    }
    return result;
}

std::ostream& operator<<(std::ostream& stream, std::vector<char> vector)
{
    stream << "Vector: " << vector << std::endl;
    return stream;
}

int main() {
    std::vector<char> foo = { 'a', 'b','c','d','e','f','j' };
    std::vector<char> bar = charAt(foo);
    std::cout << bar << std::endl;
}
EN

回答 3

Stack Overflow用户

发布于 2017-01-23 18:07:18

让我们仔细看看你的输出操作符:

代码语言:javascript
运行
复制
std::ostream& operator<<(std::ostream& stream, std::vector<char> vector)
{
    stream << "Vector: " << vector << std::endl;
    return stream;
}

当你输出一个std::vector<char>时,它会被调用。然后,它将输出一个导致递归调用的std::vector<char>,依此类推,直到出现堆栈溢出。

你的输出操作符需要做的就是迭代向量并输出每个元素。

在不相关的说明中,不要将向量按值传递给函数。而应使用常量引用:

代码语言:javascript
运行
复制
std::ostream& operator<<(std::ostream& stream, std::vector<char> const& vector) { ... }
票数 3
EN

Stack Overflow用户

发布于 2017-01-23 18:08:32

嗯,你的operator<<不仅没用(因为它什么也不做,只是包装了你在main中的同一行代码),而且它还递归地调用自己,所以你最终会得到一个so:

代码语言:javascript
运行
复制
std::ostream& operator<<(std::ostream& stream, std::vector<char> vector)
{
    stream << "Vector: " << vector << std::endl;
                         \__________/
                                ^
                                |
                             recursion right here  
    return stream;
}

你可能想要像这样的东西

代码语言:javascript
运行
复制
std::ostream& operator<<(std::ostream& stream, std::vector<char> vector)
{
    stream << "Vector: " << std::endl;
    for(size_t i = 0; i < vector.size(); ++i)
        stream  << vector[i] << " ";
    stream  << std::endl;
    return stream;
}

此外,您的charAt还可以改进:

代码语言:javascript
运行
复制
std::vector<char> charAt(const std::vector<char> & str)
{
    std::vector<char> result;

    for (size_t i = 0; i < str.size(); i++)
    {
        if (i % 2 == 0)
        {
            result.push_back(str[i]);
        }
    }
    return result;
}
票数 1
EN

Stack Overflow用户

发布于 2017-01-23 19:40:47

您是否打算使用std::string,而使用了错误的STL容器。

代码语言:javascript
运行
复制
#include <iostream>

std::string charAt(std::string str)
{
    std::string result;
    result.resize(str.size());

    for (int i = 0; i < str.size(); i++)
    {
        if (i % 2 == 0)
        {
            for (int j = 0; j < str.size(); j++)
            {
                if (result[j] == '\0')
                {
                    result[j] = str[i];
                    break;
                }
            }
        }
    }
    return result;
}

int main() {
    std::string foo = { 'a', 'b', 'c', 'd', 'e', 'f', 'j' };
    std::string bar = charAt(foo);
    std::cout << bar << std::endl;
}

输出

代码语言:javascript
运行
复制
acej
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41803608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档