小编Jos*_*ver的帖子

如何避免在C++中使用带有std :: vector :: erase()的const_cast?

我有一个这样的课:

  template<class T>
  class AdjacencyList {
  public:
    void delete_node(const T&);

  protected:
    const typename std::vector<T>::const_iterator _iterator_for_node(
        const std::vector<T>&, const T&
    );
  };

  template<class T>
  void AdjacencyList<T>::delete_node(const T& node) {
    _nodes.erase(_iterator_for_node(_nodes, node));
  }

  template<class T>
  const typename std::vector<T>::const_iterator AdjacencyList<T>::_iterator_for_node(
      const std::vector<T>& list, const T& node
  ) {
    typename std::vector<T>::const_iterator iter =
        std::find(list.begin(), list.end(), node);
    if (iter != list.end())
      return iter;

    throw NoSuchNodeException();
  }
Run Code Online (Sandbox Code Playgroud)

显然,std::vector::erase()不能拿一个const_iterator,但std::find()需要一个.我可以抛弃它在const返回std::find()时返回的迭代器的性能std::vector::erase(),但有效的C++教会我const_cast怀疑.

还有另一种方法吗?我无法相信从向量中移除元素这一常见的东西应该需要类型体操.:)

c++ stl casting const

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

什么是替换snprintf(3)的C++习语?

我有一些C++代码需要在解析某个文件头失败时生成错误消息.在这种情况下,我需要确保标头中的某个4字节字段是"OggS",如果不是,则返回错误消息,例如"invalid capture_pattern:'FooB';期望'OggS'".我的代码看起来像这样:

const string OggPage::parseHeader(void) {
  read(fd, capture_pattern, sizeof(capture_pattern)); // error handling omitted
  if (strncmp(capture_pattern, CAPTURE_PATTERN, sizeof(capture_pattern)) != 0) {
    char err[256];
    snprintf(err, sizeof(err), "Failed to read %d bytes from file descriptor %d: %s\n", sizeof(capture_pattern), fd, err);
    return err;
  }

  return "Everything was A-OK!";
}
Run Code Online (Sandbox Code Playgroud)

从其他数据类型构建字符串的标准C++习惯用法是什么?我不是printf(3)在这里坚持这种风格的格式,所以请随意提出任何可行的方法.

c++

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

在Rails迁移中创建索引时如何限制字段长度?

我有一个迁移,它使用add_index以下内容为现有表添加索引:

add_index :foo, [:foo_type, :bar_id, :baz_id], :unique => true
Run Code Online (Sandbox Code Playgroud)

但是,我的字段足够长,超过了最大的InnoDB密钥长度.根据Anders Arpteg如何增加MySQL 5.1密钥长度的回答,我需要像这样生成SQL:

CREATE UNIQUE INDEX `index_matches_on_foo_and_bar_id_and_baz_id` ON `matches` (`foo`(100), `bar_id`(100), `baz_id`(100))
Run Code Online (Sandbox Code Playgroud)

我可以用漂亮的Rails-y方式做到这一点,还是我必须坚持在迁移中使用原始SQL?

ruby-on-rails

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

在MySQL 5中,SELECT COUNT(1)FROM table_name非常慢

我有一个MySQL 5.0数据库,其中包含几个包含超过50M行的表.但我怎么知道这个?当然,通过运行"SELECT COUNT(1)FROM foo".对包含58.8M行的一个表的查询需要10分钟才能完成!

mysql> SELECT COUNT(1) FROM large_table;
+----------+
| count(1) |
+----------+
| 58778494 | 
+----------+
1 row in set (10 min 23.88 sec)

mysql> EXPLAIN SELECT COUNT(1) FROM large_table;
+----+-------------+-------------------+-------+---------------+----------------------------------------+---------+------+-----------+-------------+
| id | select_type | table             | type  | possible_keys | key                                    | key_len | ref  | rows      | Extra       |
+----+-------------+-------------------+-------+---------------+----------------------------------------+---------+------+-----------+-------------+
|  1 | SIMPLE      | large_table       | index | NULL          | fk_large_table_other_table_id          | 5       | NULL | 167567567 | Using index | 
+----+-------------+-------------------+-------+---------------+----------------------------------------+---------+------+-----------+-------------+ …
Run Code Online (Sandbox Code Playgroud)

mysql

3
推荐指数
1
解决办法
4441
查看次数

如何在C++中定义接口?

我正在研究一个C++类,它提供了用于网络的BSD套接字的抽象.我想定义一个ISocketCSocket和实现的接口MockSocket(后者用于单元测试).我知道我需要定义我希望实现类提供为纯虚拟的方法,即

class ISocket {
public:
  virtual int Socket(int domain, int type, int protocol) = 0;
};
Run Code Online (Sandbox Code Playgroud)

我担心的是是否ISocket可以实例化一类类型.我的直觉告诉我,任何具有至少一个纯虚方法的类都是一个抽象类(即接口)并且无法实例化,但我心里有一种琐碎的担心,我需要对自动生成做一些事情. C++编译器将提供的构造函数和析构函数(当你记住你在其中读到的所有东西时,有效的C++既是礼物也是诅咒 - 当你不记得时).

我是否正确地执行此操作,或者是否有最佳实践来定义C++中我不遵循的接口?

c++ oop

3
推荐指数
1
解决办法
278
查看次数

在Clojure中代理命名参数的惯用方法

我需要一个薄包装功能sqs/receive-message,以添加默认的等待时间.该函数需要一个队列URL,然后接受任意数量的可选命名参数,这些参数应该传递给sqs/receive-message未触及的.我想这样称呼它:

(my-receive-message "https://sqs.us-east-1.amazonaws.com/123/test-q"
                    :max-number-of-messages 10
                    :delete true)
Run Code Online (Sandbox Code Playgroud)

这应该会导致这样的调用sqs/receive-message:

(sqs/receive-message :queue-url "https://sqs.us-east-1.amazonaws.com/123/test-q"
                     :wait-time-seconds 20
                     :max-number-of-messages 10
                     :delete true)
Run Code Online (Sandbox Code Playgroud)

这是我发现自己想要经常做的事情,但我还没有找到一个好方法.这是否有惯用的方法?

clojure amazonica

3
推荐指数
1
解决办法
125
查看次数

使用Clojure中的Prismatic/schema进行函数验证

关于使用Prismatic/schema来验证函数,我有一个非常简单的问题.我有一个具有单个键的映射的模式,其值是一个函数,它将Bar模式作为其单个参数并返回任何内容(用于副作用):

(require '[schema.core :as s])

(def Bar {:baz s/Int})
(def Action :???)
(def Foo {:action Action})
Run Code Online (Sandbox Code Playgroud)

问题是,我该如何定义Action?我试过这个:

(require '[schema.macros :as sm])

(def Action (sm/=> s/Any Bar))
Run Code Online (Sandbox Code Playgroud)

这看起来很有希望,但我不能让它失败验证:

(s/explain Action)
;=> (=> Any {:baz Int})

;; This should fail    
(s/validate Foo {:action :anything-goes})
;=> {:action :anything-goes}
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

我在core_test中阅读了文档和测试,但我无法弄清楚如何做到这一点.

clojure plumatic-schema

3
推荐指数
1
解决办法
944
查看次数

在Clojure中从分层树结构创建id的哈希映射的优雅方法

我正在研究一些Clojure代码,其中我有一个像这样的实体树:

foo1
 +-- bar1
 | +-- baz1
 | +-- baz2
 +-- bar2
   +-- baz3
foo2
 +-- bar3
   +-- baz4
Run Code Online (Sandbox Code Playgroud)

如果我的荒谬的ASCII艺术没有意义,我有一个foos列表,每个foos可以有零个或多个条形,每个条形可能有零个或多个bazes.

我想要做的是生成一个哈希映射,其中键是baz ID,值是条形码 ID; 即上图将是:

{"baz1" "bar1", "baz2" "bar1", "baz3" "bar2", "baz4" "bar3"}
Run Code Online (Sandbox Code Playgroud)

我的数据结构如下所示:

(def foos [
  {:id "foo1" :bars [
    {:id "bar1" :bazes [
      {:id "baz1"}
      {:id "baz2"}
    ]}
    {:id "bar2" :bazes [
      {:id "baz3"}
    ]}
  ]}
  {:id "foo2" :bars [
    {:id "bar3" :bazes [
      {:id "baz4"}
    ]} …
Run Code Online (Sandbox Code Playgroud)

functional-programming clojure

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

在Clojure中从命令行设置调试功能

我有这样的命名空间:

(ns foo.core)

(def ^:dynamic *debug-fn*
  "A function taking arguments [bar baz]"
  nil)

(defn bar-info
  [bar _]
  (println bar))

(defn baz-info
  [_ baz]
  (println baz))

(defn do-stuff
  [bar baz]
  (when *debug-fn* (*debug-fn* bar baz)))

(defn -main
  [& {:keys [debug-fn]}]
  (binding [*debug-fn* (symbol debug-fn)]  ;; THIS WON'T WORK!
    (do-stuff 27 42)))
Run Code Online (Sandbox Code Playgroud)

我想要做的是允许从命令行指定调试函数,如下所示:lein run bar-infolein run baz-info.

我不确定如何将指定的字符串作为命令行参数,并将其转换为要绑定的名称空间限定函数.我需要一个宏来做这个吗?

clojure

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

Elastic Beanstalk部署停留在更新配置设置上

我一直在测试我的持续部署设置,试图获得一组最小的IAM权限,这将允许我的CI IAM组部署到我的"staging"Elastic Beanstalk环境.

在我的最新测试中,我的部署陷入困境.控制台中的最后一个事件是:

Updating environment staging's configuration settings.
Run Code Online (Sandbox Code Playgroud)

幸运的是,部署将在30分钟后超时,因此可以再次部署环境.

这似乎是一个权限问题,因为如果我授予s3:*所有资源,则部署可以正常工作.似乎在调用UpdateEnvironment时,Elastic Beanstalk对S3做了一些事情,但我无法弄清楚是什么.

我尝试了以下策略来授予EB对其资源桶的完全访问权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::elasticbeanstalk-REGION-ACCOUNT/resources/_runtime/_embedded_extensions/APP",
                "arn:aws:s3:::elasticbeanstalk-REGION-ACCOUNT/resources/_runtime/_embedded_extensions/APP/*",
                "arn:aws:s3:::elasticbeanstalk-REGION-ACCOUNT/resources/environments/ENV_ID",
                "arn:aws:s3:::elasticbeanstalk-REGION-ACCOUNT/resources/environments/ENV_ID/*"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

其中REGION,ACCOUNT,APP,和ENV_ID是我的AWS区域,账号,应用程序名称和环境ID,分别.

有没有人知道S3动作和资源EB试图访问哪些?

amazon-web-services amazon-elastic-beanstalk

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