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 …
从头开始设计新系统.我将使用STL来存储某些长寿命对象的列表和地图.
问题:我是否应该确保我的对象具有复制构造函数并在我的STL容器中存储对象的副本,或者通常更好地自己管理生命和范围并将指针存储到我的STL容器中的那些对象?
我意识到这在细节方面有点短暂,但我正在寻找"理论上"更好的答案,如果它存在,因为我知道这两种解决方案都是可能的.
使用指针的两个非常明显的缺点:1)我必须在超出STL的范围内管理这些对象的分配/释放.2)我无法在堆栈上创建临时对象并将其添加到我的容器中.
还有什么我想念的吗?
我正在开发一个在基于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,因此无法在此项目中使用)
我看到很多关于如何使用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) 我有多个使用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) 尝试编译以下示例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)
谁知道我错过了什么?
如果我直接使用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) 我想从基于Linux的系统上运行的C应用程序中获得系统正常运行时间.我不想调用uptime(1)并解析输出,我想调用我怀疑存在的底层C API.任何人都知道是否有这样的电话,或者正常运行时间(1)只是处理从wtmp获得的记录?
通过阅读其他Stack Overflow条目和boost::asio文档,我已经确认没有同步ASIO读/写调用也提供易于使用的超时作为调用的参数.
我正在使用带有超时的select(2)调用来转换旧式Linux套接字应用程序,我需要做大致相同的事情.
那么最好的方法是什么boost::asio?看一下asio文档,有很多令人困惑的例子,各种与定时器有关的东西,但我很困惑.
我很想看到一个简单易懂的例子:从套接字读取,但等待最多X秒,之后函数返回什么都没有,或者返回任何能够从套接字读取的内容在超时到期之前.
鉴于此C++ 11示例代码:
for ( const auto &foo : bar() )
{
// ... do something with foo...
}
Run Code Online (Sandbox Code Playgroud)
标准是否保证bar()本例中的表达式仅被评估一次?
或者它最终会在循环的每次迭代中被调用?