首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在分配不同区域而不重复循环的情况下,make_shared计数时间?

如何在分配不同区域而不重复循环的情况下,make_shared计数时间?
EN

Stack Overflow用户
提问于 2017-03-29 19:54:01
回答 2查看 140关注 0票数 2

如何计算make_shared 计数时间,分配不同的区域而不重复循环?

我有以下代码:

代码语言:javascript
运行
复制
for( unsigned int count = 0; count < demandedSize; ++count  )
{   
   m_connectionList.push_back( std::make_shared< Foo >( m_ip, m_port )); 
}

如何在没有循环的情况下缩短此

我知道std::vector使用第二个参数作为const T&,但在这种情况下,所有shared_ptr都指向相同的地址(值被复制)。

代码语言:javascript
运行
复制
std::vector< std::shared_ptr<Foo> > vet( demandedSize, std::make_shared<Foo>( m_ip, m_port ) );

如何执行make_shared计数时间,将不同的区域作为结果分配,而不重复循环

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-29 20:11:25

代码语言:javascript
运行
复制
template<class X>
struct arrow_helper_t {
  X x;
  auto operator->()&& { return std::addressof(x); }
};
template<class X>
arrow_helper_t<X> arrow_helper(X&& x){ return {std::forward<X>(x)}; }

template<class F>
struct generator_iterator_t {
  std::size_t i = 0;
  F f;
  generator_iterator_t()=default;
  generator_iterator_t(generator_iterator_t const&)=default;
  generator_iterator_t(generator_iterator_t &&)=default;
  generator_iterator_t& operator=(generator_iterator_t const&)=default;
  generator_iterator_t& operator=(generator_iterator_t &&)=default;
  using iterator_category = std::input_iterator_tag;
  using reference=decltype(std::declval<F const&>()(std::declval<std::size_t const&>()));
  using value_type = std::decay_t<reference>;
  using pointer = arrow_helper_t<reference>;
  using difference_type = std::ptrdiff_t;
  using self_t = generator_iterator_t;
  friend bool operator!=(self_t const& lhs, self_t const& rhs) { return lhs.i != rhs.i; }
  friend bool operator==(self_t const& lhs, self_t const& rhs) { return lhs.i == rhs.i; }
  decltype(auto) operator*()const { return f(i); }
  auto operator->() const { return arrow_helper(**this); }
  self_t& operator++() { ++i; return *this; }
  self_t operator++(int) { auto r = *this; ++i; return r; }
};
template<class F>
generator_iterator_t<F>
generator_iterator( F f, std::size_t i ) {
  return {i, std::move(f)};
}
template<class F>
auto generator_range( F f, std::size_t i ) {
  return std::make_pair(
    generator_iterator(f, 0),
    generator_iterator(f, i)
  );
}

auto range = generator_range([&](auto){return std::make_shared< Foo >( m_ip, m_port );}, demandedSize);
m_connectionList.reserve( m_connectionList.size()+demandedSize );
m_connectionList.insert(m_connectionList.end(),
  range.first, range.second
);

或者其他的。boost可能做得更好。

实例化

票数 1
EN

Stack Overflow用户

发布于 2017-03-29 20:01:58

这应该能起作用:

代码语言:javascript
运行
复制
std::generate_n( back_inserter( m_connectionList ), demandedSize, [this]{
    return std::make_shared< Foo >( m_ip, m_port ) );
});

Coliru的活生生的例子。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43102934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档