我希望输出:
acej
使用此算法可以正常工作,但输出结果时出现问题,此问题导致堆栈溢出。
我该如何解决?
#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;
}
答案 0 :(得分:3)
让我们仔细看看你的输出操作符:
std::ostream& operator<<(std::ostream& stream, std::vector<char> vector)
{
stream << "Vector: " << vector << std::endl;
return stream;
}
输出std::vector<char>
时会调用它。然后它将输出一个std::vector<char>
,这会导致递归调用,依此类推在无穷大(或直到你得到堆栈溢出)。
输出操作符需要的是迭代在向量上并输出每个元素。
在不相关的注释中,不要将值向量传递给函数。而是使用常量引用:
std::ostream& operator<<(std::ostream& stream, std::vector<char> const& vector) { ... }
答案 1 :(得分:1)
好吧,你的operator<<
不仅无用(因为它除了包装你在main
中的相同代码行之外什么都没有),但它也是递归地调用自己,所以你得到了一个最终:
std::ostream& operator<<(std::ostream& stream, std::vector<char> vector)
{
stream << "Vector: " << vector << std::endl;
\__________/
^
|
recursion right here
return stream;
}
你可能想要像
这样的东西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
也可以改进:
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;
}
答案 2 :(得分:0)
您是否打算使用std::string
并使用错误的STL容器。
#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;
}
输出
acej