我有一个Visual Studio 2008 C++ 03应用程序,我想在其中创建一个std::map
使用另一个迭代器std::map
作为其键类型的迭代器.但是,当我尝试使用其键类型从该映射中擦除元素时,我遇到了问题.
在此示例中,当一个元素MyList
变为超过5分钟时,计时器应该触发并将其从地图中删除并销毁其年龄计时器.
typedef std::map< Foo, FooBar > MyList;
typedef std::map< MyList::iterator, boost::shared_ptr< Timer > > MyListAgeTimers;
class A
{
public:
void AddItem( Foo& f, FooBar& fb )
{
CriticalSection::Guard g( lock_ );
std::pair< MyList::iterator, bool > new_foo =
my_list_.insert( std::make_pair( f, fb ) );
if( new_foo.second )
{
timers_.insert( std::make_pair(
new_foo.first,
boost::make_shared< Timer >( FiveMinutes, boost::bind( &A::OnAgeTimer, this, new_foo.first ) ) ) );
}
};
void OnAgeTimer( MyList::iterator item ) …
Run Code Online (Sandbox Code Playgroud) 我有一些看起来像这样的C99代码:
struct foo {
char* buf;
size_t buf_sz;
};
struct foo list[3];
list[0].buf = "The first entry";
list[0].buf_sz = strlen(list[0].buf);
list[1].buf = "The second entry";
list[1].buf_sz = strlen(list[1].buf);
list[2].buf = "The third entry";
list[2].buf_sz = strlen(list[2].buf);
Run Code Online (Sandbox Code Playgroud)
有没有在初始化列表中写这个的简写方法?这样安全吗?
struct foo list[] = {
{ "The first entry", strlen(list[0].buf) },
{ "The second entry", strlen(list[1].buf) },
{ "The third entry", strlen(list[2].buf) }
};
Run Code Online (Sandbox Code Playgroud) 我有一个这样的basic_iostream派生类:
class MyStream : public std::basic_iostream< char >,
private boost::noncopyable
{
public:
explicit MyStream( SomeUsefulData& data ) :
buffer_( data ),
std::basic_iostream< char >( &buffer_ )
{
};
~MyStream()
{
};
private:
/// internal stream buffer
MyStreamBuffer< char > buffer_;
}; // class MyStream
Run Code Online (Sandbox Code Playgroud)
但是,当我创建它的实例时,我得到一个DataAbort异常.
SomeUsefulData data;
MyStream stream( data ); // <- Data Abort
Run Code Online (Sandbox Code Playgroud)
但是,如果我将MyStream更改为堆分配MyStreamBuffer,它可以正常工作:
class MyStream : public std::basic_iostream< char >,
private boost::noncopyable
{
public:
explicit MyStream( SomeUsefulData& data ) :
std::basic_iostream< char >( new MyStreamBuffer< char >( …
Run Code Online (Sandbox Code Playgroud) 我有一个Visual Studio 2008 C++应用程序,其中包含一个const char*[2]
我想要转换为a的参数std::pair< std::string, std::string >
.有一个简单的方法吗?
例如:
typedef std::pair< std::string, std::string > Group;
const char* a[ 2 ] = { "buzz", "foo" };
Group z = a; // ???
// a->first.c_str() == "buzz"
// a->second.c_str() == "foo"
Run Code Online (Sandbox Code Playgroud)
谢谢,PaulH