我正在尝试使用此线程中找到的方法拆分字符串,但我正在尝试将其调整为wstring.但是,我偶然发现了一个奇怪的错误.检查代码:
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
int main(void)
{
wstring str(L"Börk börk");
wistringstream iss(str);
vector<wstring> tokens;
copy(istream_iterator<wstring>(iss), // I GET THE ERROR HERE
istream_iterator<wstring>(),
back_inserter< vector<wstring> >(tokens));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
确切的错误消息是:
error: no matching function for call to 'std::istream_iterator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, char, std::char_traits<char>, int>::istream_iterator(std::wistringstream&)'
Run Code Online (Sandbox Code Playgroud)
我认为它说它不能使用传递的实例化istream_iterator iss
(这是一个w istringstream而不是istringstream).这是在使用XCode和GCC 4.2的Mac上.和AFAIK没有wistring_iterator或类似的东西.
当我使用非wstring版本时它完美地工作.正如您可能看到我已经更改了要使用的声明wstring
,wistringstream
s和vector<wstring>
,只是将所有内容替换为使用宽版本.
什么可能导致这个,为什么它不接受wstring-version?
我已经使用<<
stream运算符为对象实现了反序列化例程.例程本身使用an istreambuf_iterator<char>
逐个从流中提取字符,以构造对象.
最终,我的目标是能够使用a迭代流istream_iterator<MyObject>
并将每个对象插入到vector
.漂亮的标准,除了我遇到麻烦istream_iterator
,以停止时,如果击中结束流迭代.现在,它只是永远循环,即使调用istream::tellg()
表明我在文件的末尾.
这是重现问题的代码:
struct Foo
{
Foo() { }
Foo(char a_, char b_) : a(a_), b(b_) { }
char a;
char b;
};
// Output stream operator
std::ostream& operator << (std::ostream& os, const Foo& f)
{
os << f.a << f.b;
return os;
}
// Input stream operator
std::istream& operator >> (std::istream& is, Foo& f)
{
if (is.good())
{
std::istreambuf_iterator<char> it(is);
std::istreambuf_iterator<char> end;
if (it != …
Run Code Online (Sandbox Code Playgroud) 在Boost的第一个例子中in(std::cin)
使用.我认为in()
得到一个istream
并创建一些迭代器.但是,我找不到任何能够详细解释它的C++文档.你能帮我找一个吗?
这是Boost网页上示例的复制和粘贴:
#include <boost/lambda/lambda.hpp>
#include <iostream>
#include <iterator>
#include <algorithm>
int main()
{
using namespace boost::lambda;
typedef std::istream_iterator<int> in;
std::for_each(
in(std::cin), in(), std::cout << (_1 * 3) << " " );
}
Run Code Online (Sandbox Code Playgroud) 鉴于这样的代码段:
#include <iostream>
#include <iterator>
#include <fstream>
#include <string>
using namespace std;
int main(){
ifstream file("1.txt");
string str((istream_iterator<char>(file)),istream_iterator<char>());
file.close();
cout<<str<<endl;
}
Run Code Online (Sandbox Code Playgroud)
该代码使用istream_iterator从文件构造一个字符串.
请注意,字符串构造函数的第一个参数用一对括号括起来.如果省略括号,则会出错.在VC++ 2008中,会出现链接错误.在G ++中,代码输出错误.
我对括号感到很奇怪.有什么区别,为什么?
我想,以计算读元素的含量std::cin
,通过使用std::distance
预先为载体的构造函数的参数,就像这样:
// Gives correct amount, but now can't use to put into vector
int size = std::distance(std::istream_iterator<std::string>(std::cin),
std::istream_iterator<std::string>());
std::vector v(size);
// Already read from stream
std::copy(...);
Run Code Online (Sandbox Code Playgroud)
显然,我可以一步完成std::copy
,但这需要事先设置一个尺寸.我的问题不是关于向量,而是关于在std::istream_iterator
不影响流的情况下使用任意输入的大小.有任何想法吗?
有以下一段代码:
std::vector<int64> values;
std::copy(
std::istream_iterator<int64>(std::cin),
std::istream_iterator<int64>(),
std::back_inserter(values)
);
Run Code Online (Sandbox Code Playgroud)
我想让它只读取输入流直到行尾。我怎样才能做到这一点std::istream_iterator
?
g ++允许从ifstream实例构造istream_iterator:
std::ifstream ifstr("test.txt");
std::istream_iterator<std::string> iter1(ifstr);
Run Code Online (Sandbox Code Playgroud)
...但它不允许使用未命名的临时构造:
std::istream_iterator<std::string> iter2(std::ifstream("test.txt"));
Run Code Online (Sandbox Code Playgroud)
这给出了:
错误:没有用于调用'std :: istream_iterator,ptrdiff_t> :: istream_iterator(std :: ifstream)'的匹配函数
有谁知道为什么这不起作用?- 谢谢!
为什么这个循环不会终止?程序打印出istream_iterator中的所有元素后冻结.
/*30*/ int main( int arc, char **arv ) {
/*31*/ vector<float> numbers( 0 );
/*32*/ cout << "Please, input even number of floats: ";
/*33*/ istream_iterator<float> iit (cin);
/*34*/ istream_iterator<float> eos;
/*35*/ while( iit != eos ) {
/*36*/ cout << (*iit) << endl;
/*37*/ iit++;
/*38*/ }
/*39*/ if( numbers.size( ) & 1 == 1 ) {
/*40*/ cerr << "Sorry: you must input"
/*41*/ << " an even number of inputs" << endl;
/*42*/ }
/*43*/ return …
Run Code Online (Sandbox Code Playgroud) #include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <list>
using namespace std;
int main()
{
istream_iterator<int> in_iter(cin);
istream_iterator<int> eof;
vector<int> vin;
/*while (in_iter!=eof)
{
vin.push_back(*in_iter++);
}*/
istream_iterator<int> in_iter2(cin), eof2;
vector<int> vin2(in_iter2,eof2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我输入1 2 3 c
(最后一个元素'c'使cin状态为EOF)到程序时,最后,vin2
将包含元素:2 3
;但是,当我注释变量的声明时in_iter
,相同的输入将vin2
包含元素:1 2 3
; How变量声明in_iter
是否对此程序有效?谢谢!
为什么 GCC 和 Clang 无法编译下面的代码片段(链接)?我想返回 s 的向量std::string_view
,但显然无法string_view
从 中提取 s stringstream
。
#include <iostream>
#include <sstream>
#include <string>
#include <string_view>
#include <vector>
#include <iterator>
#include <algorithm>
#include <ranges>
[[ nodiscard ]] std::vector< std::string_view >
tokenize( const std::string_view inputStr, const size_t expectedTokenCount )
{
std::vector< std::string_view > foundTokens { };
if ( inputStr.empty( ) ) [[ unlikely ]]
{
return foundTokens;
}
std::stringstream ss;
ss << inputStr;
foundTokens.reserve( expectedTokenCount );
std::copy( std::istream_iterator< std::string_view >{ ss }, …
Run Code Online (Sandbox Code Playgroud) c++ ×10
istream-iterator ×10
stl ×3
istream ×2
constructor ×1
distance ×1
iostream ×1
iterator ×1
libstdc++ ×1
stdstring ×1
string-view ×1
wstring ×1