我有一个函数,它接受整数向量并通过
std::cout
输出它们。
#include <iostream>
#include <vector>
void final_sol(std::vector<int> list){
for (int i ; i < list.size() ; i++){
std::cout << list[i] << " ";
}
}
int main(){
std::vector<int> list = {1, 2, 3, 4, 5};
final_sol(list);
return 0;
}
但是,从这一点开始,我希望有一种方法可以快速获取
final_sol(vector)
的输出作为字符串。一种方法是修改原始函数以创建字符串。不过,我对修改final_sol(vector)
不感兴趣。还有另一种方法可以将输出存储为字符串吗?
提供过载:
void final_sol(std::ostream& out, const std::vector<int>& list){
for (int i = 0; i < list.size() ; i++){
out << list[i] << " ";
}
}
void final_sol(const std::vector<int>& list){
final_sol(std::cout, list);
}
这样您现有的调用代码将不会受到影响 - 这很可能就是您想要的:不修改函数签名。不是你所描述的那样:不要修改 Final_sol 的实现。
然后你可以这样做:
std::ostringstream str;
final_sol(str, list);
auto s = str.str()
由于您“对修改
final_sol(vector)
不感兴趣”,这意味着您被困于final_sol()
写入std::cout
,在这种情况下,您的唯一选项是更改std::cout
将其数据输出到的位置。您可以使用其 rdbuf()
方法来实现此目的,例如:
#include <iostream>
#include <sstream>
#include <vector>
void final_sol(const std::vector<int> &list){
for (size_t i = 0; i < list.size(); ++i){
std::cout << list[i] << " ";
}
}
int main(){
std::vector<int> list = {1, 2, 3, 4, 5};
// save pointer to std::cout buffer
auto cout_buff = std::cout.rdbuf();
// substitute std::cout buffer with 'local' buffer
std::ostringstream local;
std::cout.rdbuf(local.rdbuf());
// now std::cout works with the 'local' buffer
// so you won't see any console output here
final_sol(list);
// go back to the old buffer
std::cout.rdbuf(cout_buff);
// use the local buffer as needed ...
std::cout << local.str();
return 0;
}
但是,正确的解决方案是:
有
final_sol()
返回一个std::string
,然后调用者可以决定如何处理它,例如:
#include <iostream>
#include <vector>
#include <string>
std::string final_sol(const std::vector<int> &list){
std::string s;
for (size_t i = 0; i < list.size(); ++i){
s += (std::to_string(list[i]) + " ");
}
return s;
}
int main(){
std::vector<int> list = {1, 2, 3, 4, 5};
std::string s = final_sol(list);
// use s as needed...
std::cout << s;
return 0;
}
有
final_sol()
接受 std::ostream&
参数,以便调用者可以决定将输出写入何处,例如 std::ostringstream
,例如:
#include <iostream>
#include <sstring>
#include <vector>
void final_sol(const std::vector<int> &list, std::ostream &out){
for (size_t i = 0; i < list.size(); ++i){
out << list[i] << " ";
}
}
int main(){
std::vector<int> list = {1, 2, 3, 4, 5};
std::ostringstream oss;
final_sol(list, oss);
// use oss.str() as needed...
std::cout << oss.str();
return 0;
}