小编Sté*_*ane的帖子

如何使用基于范围的for()循环与std :: map?

C++ 11基于范围的()循环的常见示例总是这样简单:

std::vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7 };
for ( auto xyz : numbers )
{
     std::cout << xyz << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下xyz是一个int.但是,当我们有像地图这样的东西时会发生什么?此示例中变量的类型是什么:

std::map< foo, bar > testing = { /*...blah...*/ };
for ( auto abc : testing )
{
    std::cout << abc << std::endl;         // ? should this give a foo? a bar?
    std::cout << abc->first << std::endl;  // ? or is abc an iterator?
}
Run Code Online (Sandbox Code Playgroud)

当遍历的容器很简单时,看起来基于范围的()循环将给我们每个项目,而不是迭代器.哪个好...如果它是迭代器,我们总是要做的第一件事就是取消引用它.

但是,当涉及到地图和多重映射等内容时,我会感到困惑.

(我仍然使用g …

c++ dictionary for-loop c++11

316
推荐指数
4
解决办法
25万
查看次数

我应该存储整个对象,还是指向容器中对象的指针?

从头开始设计新系统.我将使用STL来存储某些长寿命对象的列表和地图.

问题:我是否应该确保我的对象具有复制构造函数并在我的STL容器中存储对象的副本,或者通常更好地自己管理生命和范围并将指针存储到我的STL容器中的那些对象?

我意识到这在细节方面有点短暂,但我正在寻找"理论上"更好的答案,如果它存在,因为我知道这两种解决方案都是可能的.

使用指针的两个非常明显的缺点:1)我必须在超出STL的范围内管理这些对象的分配/释放.2)我无法在堆栈上创建临时对象并将其添加到我的容器中.

还有什么我想念的吗?

c++ pointers stl

161
推荐指数
6
解决办法
6万
查看次数

C++:我应该使用什么正则表达式库?

我正在开发一个在基于linux的系统上运行的商业(非开源)C++项目.我需要在C++代码中做一些正则表达式.(我知道:我现在有2个问题.)

问题:经常从C/C++开始使用正则表达式的人建议我查看哪些库?快速搜索引起了我的注意:

1)Boost.Regex(我需要阅读Boost软件许可证,但这个问题与软件许可证无关)

2)C(不是C++)POSIX正则表达式(#include <regex.h>,regcomp,regexec等)

3)http://freshmeat.net/projects/cpp_regex/ (我对此一无所知;似乎是GPL,因此无法在此项目中使用)

c++ regex linux

106
推荐指数
8
解决办法
11万
查看次数

如何使用sed,awk或gawk只打印匹配的内容?

我看到很多关于如何使用sed,awk或gawk进行搜索和替换等操作的示例和手册页.

但在我的情况下,我有一个正则表达式,我想对文本文件运行以提取特定的值.我不想做搜索和替换.这是从bash调用的.我们来举个例子:

正则表达式示例:

.*abc([0-9]+)xyz.*
Run Code Online (Sandbox Code Playgroud)

示例输入文件:

a
b
c
abc12345xyz
a
b
c
Run Code Online (Sandbox Code Playgroud)

听起来很简单,我无法弄清楚如何正确调用sed/awk/gawk.我希望做的是,在我的bash脚本中有:

myvalue=$( sed <...something...> input.txt )
Run Code Online (Sandbox Code Playgroud)

我尝试过的事情包括:

sed -e 's/.*([0-9]).*/\\1/g' example.txt # extracts the entire input file
sed -n 's/.*([0-9]).*/\\1/g' example.txt # extracts nothing
Run Code Online (Sandbox Code Playgroud)

regex unix awk sed gawk

97
推荐指数
5
解决办法
8万
查看次数

当递减到零的进程崩溃时,如何恢复信号量?

我有多个使用g ++编译的应用程序,在Ubuntu中运行.我正在使用命名信号量来协调不同的进程.

一切正常,除非在以下情况下:如果其中一个进程调用sem_wait()sem_timedwait()减少信号量然后在它有机会调用之前崩溃或被杀死-9 sem_post(),那么从那一刻起,命名信号量就"无法使用".

通过"不可用",我的意思是信号量计数现在为零,并且应该将其增加回1的过程已经死亡或被杀死.

我找不到一个sem_*()API,可能会告诉我上次减少崩溃的过程.

我在某个地方错过了API吗?

以下是我打开命名信号量的方法:

sem_t *sem = sem_open( "/testing",
    O_CREAT     |   // create the semaphore if it does not already exist
    O_CLOEXEC   ,   // close on execute
    S_IRWXU     |   // permissions:  user
    S_IRWXG     |   // permissions:  group
    S_IRWXO     ,   // permissions:  other
    1           );  // initial value of the semaphore
Run Code Online (Sandbox Code Playgroud)

这是我如何减少它:

struct timespec timeout = { 0, 0 };
clock_gettime( CLOCK_REALTIME, &timeout );
timeout.tv_sec += 5;

if …
Run Code Online (Sandbox Code Playgroud)

linux gcc semaphore g++

47
推荐指数
3
解决办法
3万
查看次数

为什么这个简单的std :: thread示例不起作用?

尝试编译以下示例g++ -std=gnu++0x t1.cpp,g++ -std=c++0x t1.cpp但这两个结果都导致示例中止.

$ ./a.out 
terminate called after throwing an instance of 'std::system_error'
  what():  
Aborted
Run Code Online (Sandbox Code Playgroud)

这是样本:

#include <thread>
#include <iostream>

void doSomeWork( void )
{
    std::cout << "hello from thread..." << std::endl;
    return;
}

int main( int argc, char *argv[] )
{
    std::thread t( doSomeWork );
    t.join();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在Ubuntu 11.04上尝试这个:

$ g++ --version
g++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2
Run Code Online (Sandbox Code Playgroud)

谁知道我错过了什么?

c++ multithreading c++11

44
推荐指数
2
解决办法
4万
查看次数

如何让CMake识别Ubuntu上的pthread?

如果我直接使用g ++在命令行上编译,我可以看到我需要的一切:

$ g++ -pthread test.cpp
$ ldd a.out
    linux-vdso.so.1 =>  (0x00007fffd05b3000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f4a1ba8d000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f4a1b870000)
    ...more...
Run Code Online (Sandbox Code Playgroud)

然后我尝试为这个5行测试应用程序创建一个简单的cmake文件:

$ cat CMakeLists.txt 
PROJECT ( Test CXX )
CMAKE_MINIMUM_REQUIRED ( VERSION 2.8 )
FIND_PACKAGE ( Threads REQUIRED )
ADD_EXECUTABLE ( test test.cpp )
TARGET_LINK_LIBRARIES ( test ${CMAKE_THREAD_LIBS_INIT} )
Run Code Online (Sandbox Code Playgroud)

但是,我无法弄清楚为什么CMake找不到它需要用的东西Threads:

$ cd build/
$ cmake ..
CMake Error at /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:97 (MESSAGE):
  Could NOT find Threads (missing: Threads_FOUND)
Call Stack (most recent call first):
  /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:288 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/cmake-2.8/Modules/FindThreads.cmake:166 (FIND_PACKAGE_HANDLE_STANDARD_ARGS) …
Run Code Online (Sandbox Code Playgroud)

c++ pthreads cmake ubuntu-12.10

32
推荐指数
1
解决办法
4万
查看次数

我打算用什么API来获得系统正常运行时间?

我想从基于Linux的系统上运行的C应用程序中获得系统正常运行时间.我不想调用uptime(1)并解析输出,我想调用我怀疑存在的底层C API.任何人都知道是否有这样的电话,或者正常运行时间(1)只是处理从wtmp获得的记录?

c linux uptime

28
推荐指数
3
解决办法
4万
查看次数

C++ Boost ASIO:如何读取/写入超时?

通过阅读其他Stack Overflow条目和boost::asio文档,我已经确认没有同步ASIO读/写调用也提供易于使用的超时作为调用的参数.

我正在使用带有超时的select(2)调用来转换旧式Linux套接字应用程序,我需要做大致相同的事情.

那么最好的方法是什么boost::asio?看一下asio文档,有很多令人困惑的例子,各种与定时器有关的东西,但我很困惑.

我很想看到一个简单易懂的例子:从套接字读取,但等待最多X秒,之后函数返回什么都没有,或者返回任何能够从套接字读取的内容在超时到期之前.

c++ sockets boost-asio

22
推荐指数
2
解决办法
1万
查看次数

C++ 11基于范围的()循环评估一次或多次?

鉴于此C++ 11示例代码:

for ( const auto &foo : bar() )
{
    // ... do something with foo...
}
Run Code Online (Sandbox Code Playgroud)

标准是否保证bar()本例中的表达式仅被评估一次?

或者它最终会在循环的每次迭代中被调用?

c++ foreach for-loop c++11

21
推荐指数
1
解决办法
1906
查看次数