我已经用C++编程了很长一段时间了,但我偶尔偶然发现一个使用STL的代码片段,这会花费我很多时间和更多的代码来完成.
STL需要相当长的一段时间才能习惯,并且没有很多资源可以提供有关如何使用它的真实示例.请与我分享您最喜爱的STL功能!
我正在尝试使用boost :: iostreams将以下bash代码转换为C++:
#!/usr/bin/bash
(
gzip -cd file1.ext.gz
cat file2.ext
) | grep '^regex' # or sed 's/search/replace/'
Run Code Online (Sandbox Code Playgroud)
我可以打开一个文件并解压缩它:
std::ifstream s("file.ext.gz", std::ios_base::in | std::ios_base::binary);
boost::iostreams::filtering_istreambuf in;
in.push(boost::iostreams::gzip_decompressor());
in.push(s);
Run Code Online (Sandbox Code Playgroud)
然后打开一个未压缩的文件:
std::ifstream s2("file.ext", std::ios_base::in | std::ios_base::binary);
Run Code Online (Sandbox Code Playgroud)
现在我有点卡住了,所以这是我的问题:
1)什么是boost :: iostreams解决方案来连接两个流?
2)如何通过正则表达式过滤器输出结果来模拟grep/sed?
因此,我想要一个可以复制到cout的istream:
boost::iostream::copy(result, std::cout);
Run Code Online (Sandbox Code Playgroud)
使用Hamigaki的连接更新完整解决方案:
/*
* convert the following bash script into C++
*
* #!/bin/bash
* (
* gzip -cd file1.ext.gz
* cat file2.ext
* ) | grep '^filter' | 'sed s/search/replace/g'
*
*/
#include <iostream>
#include …Run Code Online (Sandbox Code Playgroud) int main()
{
char *temp = "Paras";
int i;
i=0;
temp[3]='F';
for (i =0 ; i < 5 ; i++ )
printf("%c\n", temp[i]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么 temp[3]='F';会造成分割的错,因为temp是不const?
在SQL Server 2008上,我试图将所有选定值的逗号分隔列表添加到变量中.
SELECT field
FROM table
Run Code Online (Sandbox Code Playgroud)
收益:
+-------+
| field |
+-------+
| foo |
+-------+
| bar |
+-------+
Run Code Online (Sandbox Code Playgroud)
我想得到:"foo,bar,"
我试过了:
DECLARE @foo NVARCHAR(MAX)
SET @foo = ''
SELECT @foo = @foo + field + ','
FROM TABLE
PRINT @foo
Run Code Online (Sandbox Code Playgroud)
什么都不返回.我究竟做错了什么?
我编译了以下示例:
#include <iostream>
#include <iterator>
using namespace std;
class myiterator : public iterator<input_iterator_tag, int>
{
int* p;
public:
myiterator(int* x) :p(x) {}
myiterator(const myiterator& mit) : p(mit.p) {}
myiterator& operator++() {++p;return *this;}
myiterator& operator++(int) {myiterator tmp(*this); operator++(); return tmp;}
bool operator==(const myiterator& rhs) {return p==rhs.p;}
bool operator!=(const myiterator& rhs) {return p!=rhs.p;}
int& operator*() {return *p;}
};
int main () {
int numbers[]={10,20,30,40,50};
myiterator beginning(numbers);
myiterator end(numbers+5);
for (myiterator it=beginning; it!=end; it++)
cout << *it << " ";
cout << endl; …Run Code Online (Sandbox Code Playgroud) Gtk小部件发出信号滚动事件.我想在MenuItem上将函数连接到该信号.以下示例代码不起作用.
$ cat scroll-event-on-menu-item.c
#include <gtk/gtk.h>
void scroll_cb(GtkStatusIcon* icon, GdkEvent* ev, gpointer userdata)
{
g_message("scrolled!");
}
void quit_cb(GtkMenuItem* item, GdkEventButton* ev, gpointer userdata)
{
gtk_main_quit();
}
void click_cb(GtkStatusIcon* icon, GdkEventButton* ev, gpointer userdata)
{
GtkWidget* menu = gtk_menu_new();
GtkWidget* item = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
gtk_widget_show(menu);
gtk_widget_show(item);
g_signal_connect(item, "button-press-event", G_CALLBACK(quit_cb), NULL);
g_signal_connect(item, "scroll-event", G_CALLBACK(scroll_cb), NULL);
gtk_menu_popup(GTK_MENU(menu), NULL, NULL, gtk_status_icon_position_menu,
icon, ev->button, ev->time);
}
int main(int argc, char *argv[])
{
gtk_init(&argc, &argv);
GtkStatusIcon* icon = gtk_status_icon_new_from_stock(GTK_STOCK_INFO);
g_signal_connect(icon, "button-press-event", G_CALLBACK(click_cb), …Run Code Online (Sandbox Code Playgroud)