有没有办法重写一个返回指向 istringstream 的指针的函数,而不是返回一个引用?
Is there a way to rewrite a function that returns a pointer to an istringstream to instead return a reference?
这是我的代码:
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
istringstream* get_line() {
string line;
getline(cin, line);
return new istringstream(line);
}
int main() {
istringstream* line = get_line();
int number_of_arrays, number_of_queries;
*line >> number_of_arrays >> number_of_queries;
int sum = number_of_arrays + number_of_queries;
vector<int> vectors[sum];
for (int i = 0; i < sum; ++i) {
line = get_line();
int n;
while (*line >> n) vectors[i].push_back(n);
delete line;
}
cout << endl;
for (int i = number_of_arrays; i < sum; ++i) {
int vector = vectors[i][0];
int index = vectors[i][1];
cout << vectors[vector][index] << endl;
}
return 0;
}
以下是我尝试使用引用的一些尝试:
尝试 1:
istringstream& get_line() {
string line;
getline(cin, line);
return new istringstream(line);
}
...
istringstream& line = get_line();
错误:
x.cpp: In function ‘std::istringstream& get_line()’:
x.cpp:10:32: error: invalid initialization of non-const reference of type ‘std::istringstream& {aka std::__cxx11::basic_istringstream<char>&}’ from an rvalue of type ‘std::istringstream* {aka std::__cxx11::basic_istringstream<char>*}’
return new istringstream(line);
^
x.cpp: In function ‘int main()’:
x.cpp:23:12: error: type ‘std::istringstream {aka class std::__cxx11::basic_istringstream<char>}’ argument given to ‘delete’, expected pointer
delete line;
尝试 2:
const istringstream& get_line() {
string line;
getline(cin, line);
const istringstream* is = new istringstream(line);
return is;
}
...
istringstream& line = get_line();
错误:
x.cpp: In function ‘const istringstream& get_line()’:
x.cpp:11:10: error: invalid initialization of reference of type ‘const istringstream& {aka const std::__cxx11::basic_istringstream<char>&}’ from expression of type ‘const istringstream* {aka const std::__cxx11::basic_istringstream<char>*}’
return is;
^
x.cpp: In function ‘int main()’:
x.cpp:21:35: error: binding ‘const istringstream {aka const std::__cxx11::basic_istringstream<char>}’ to reference of type ‘std::istringstream& {aka std::__cxx11::basic_istringstream<char>&}’ discards qualifiers
istringstream& line = get_line();
^
x.cpp:24:12: error: type ‘std::istringstream {aka class std::__cxx11::basic_istringstream<char>}’ argument given to ‘delete’, expected pointer
delete line;
^
代码在做什么:
这是编码网站拼图的变体:
输入:
2 3//在此行之后,我将指定 2 个数组和 3 个查询
1 2 3 4 5//数组 0
6 7 8//数组 1
0 3//查询(数组 0 的索引 3 处返回元素)
11//查询(数组 1 的索引 1 处返回元素)
1 2//等
输出:
四
7
8
按值返回,示例:
#include <iostream>
#include <sstream>
std::istringstream get_line() {
std::cout << "enter: ";
std::string line;
std::getline(std::cin, line);
std::istringstream rv(line);
// set the state of the stringstream to whatever state std::cin is in to
// be able to detect EOF or error conditions outside this function
rv.setstate(std::cin.rdstate());
return rv;
}
int main() {
std::istringstream ss;
while(ss = get_line()) { // loop while the state is good
std::string a;
while(ss >> a) { // extract
std::cout << a << "n";
}
}
}
你也可以取消引用从new
获得的指针,以返回函数的引用 - 但这完全令人困惑,因为delete
stringstream
的责任对于使用该函数的人来说并不明显。在这种情况下,人们需要delete &line;
。别这样:
#include <iostream>
#include <sstream>
std::istringstream& get_line() {
std::cout << "enter: ";
std::string line;
std::getline(std::cin, line);
std::istringstream* rv = new std::istringstream(line);
// set the state of the stringstream to whatever state std::cin is in
rv->setstate(std::cin.rdstate());
return *rv; // dereference
}
int main() {
std::istringstream& line = get_line();
std::string a;
while(line>> a) { // extract
std::cout << a << "n";
}
delete &line;
}
相关文章:
- C++,class,一个返回对象的函数
- C++ 这里有一个返回 (24) 的布尔返回类型函数
- 我有一个返回字符串向量的函数.它需要两个字符串,并且返回一个字符串中缺少的字符串
- 两个相同的重载运算符[]一个返回引用
- 给定一个整数 N>0,区间 [0, 2^N) 中有多少个整数正好有 N-1 个设置位?编写一个返回正确答案的简短函数
- 为什么要定义一个返回结构的 lambda 函数,而不是直接定义结构
- 有没有办法重写一个返回指向 istringstream 的指针的函数,而不是返回一个引用?
- 提升:创建一个返回变体的函数
- C++重载运算符两次,一个返回非常量引用,另一个返回常量引用,首选项是什么
- 我是否应该将最后一个“返回”语句封装为“else { return .. }',如果它在逻辑上是可选的
- 野牛解析器:创建一个返回令牌的函数
- 为什么 C++ 数组的大小不能有一个返回常量的函数调用
- 如何创建一个返回传递的参数名称的函数
- 如何在C++中创建一个返回字节数组的函数?Arduino项目
- 将返回的指针分配给另一个返回的指针
- 如何声明一个返回类型是推导出来的函数
- Constexpr语言 - 为什么只是一个返回语句
- 如何创建一个返回护士函数的函数
- 如何用C包装一个返回智能指针的C++函数
- 如何使用两个函数,一个返回迭代器,另一个返回const_iterator