什么是最合适的容器,只适用于具有非预定上边界的某些数组中的字符串,其长度在创建时未知.
对于简单的代码,如:
var list = new SomeContainer(); // size is unknown
for()/foreach()/do()/while() // any loop
{
list.Add(string);
}
Run Code Online (Sandbox Code Playgroud)
它是StringCollection
为优化集合字符串,或者只是Collection<string>
或List<string>
或ArrayList
?他们之间有什么不同?
以前,我曾经使用MFC的集合类CArray
和CMap
.过了一会儿,我换了STL容器,并且已经使用了一段时间.虽然我发现STL要好得多,但我无法明确指出它的确切原因.一些推理如:
我可以提出的唯一原因是我可以在容器上使用算法.我在这里缺少任何其他原因 - 是什么让STL容器比MFC容器更好?
是否有一个固定长度序列的标准容器,其长度在运行时确定.我想将参数传递给每个sequence元素的构造函数,并使用该参数初始化const成员(或引用).我还想在O(1)中的给定索引处获得序列元素.在我看来,我的所有要求都无法同时满足.
std::array
有固定长度,但必须在编译时知道该长度.std::vector
具有动态大小,并允许使用传递构造函数参数emplace
.虽然你可以reserve
记忆以避免实际的重新分配,但是类型仍然必须是可移动的,理论上允许这样的重新分配,例如防止const成员.std::list
并且std::forward_list
,它不需要可移动类型,但仍然可调整大小并且在随机访问模式下将表现得相当差.我还认为这些列表可能会产生相当大的开销,因为每个列表节点可能会单独分配.std::valarray
到目前为止,这是我最好的选择,因为它有一个固定的长度,不会自动调整大小.虽然有一种resize
方法,但除非您实际调用该方法,否则您的类型不必是可移动的.这里的主要缺点是缺少自定义构造函数参数,因此使用此方法无法初始化const成员.我错过了一些替代方案吗?有没有办法调整其中一个标准容器,以满足我的所有要求?
编辑:为了让您更准确地了解我正在尝试做什么,请参阅此示例:
class A {
void foo(unsigned n);
};
class B {
private:
A* const a;
const unsigned i;
public:
B(A* aa) : a(aa), i(0) { }
B(A* aa, unsigned ii) : a(aa), i(ii) { }
B(const std::pair<A*, unsigned>& args) : B(args.first, args.second) { }
B(const B&) = delete;
B(B&&) = delete;
B& operator=(const B&) = delete; …
Run Code Online (Sandbox Code Playgroud) 有一个具有惰性和严格实现的数据结构列表:
Data.Map.Lazy
和 Data.Map.Strict
Data.IntMap.Lazy
和 Data.IntMap.Strict
Data.HashMap.Lazy
和 Data.HashMap.Strict
Data.ByteString.Lazy
和 Data.ByteString.Strict
Data.Text.Lazy
和 Data.Text
这些实施的优点和缺点是什么?选择特定实施时应遵循哪些规则?
DOCKERFILE有一个ENTRYPOINT参数,在编写Kubernetes部署yaml文件时,在COMMAND的Container规范中有一个参数.
我无法弄清楚有什么区别以及如何使用它们?
我刚刚按照https://about.gitlab.com/install/#ubuntu的说明使用 Gitlab 设置了 Ubuntu 18.04 LTS 服务器。
\n\n我已经从 GoDaddy 颁发了 ssl 证书,并确认它适用于 Gitlab 服务器。
\n\n然后我更新了 gitlab.rb:gitlab_rails[\xe2\x80\x98lfs_enabled\xe2\x80\x99] = true
我已经从https://git-lfs.github.com/安装了 GIT LFS 客户端。
\n\n然后我尝试在网上寻找解决方案,了解为什么我无法让 LFS 工作。我总是得到
\n\n\n\n\nx509:由未知权威机构签署的证书
\n
在gitlab.rb中完成的其他设置:
\n\ngitlab_workhorse[\xe2\x80\x98env\xe2\x80\x99] = {\n\xe2\x80\x98SSL_CERT_DIR\xe2\x80\x99 => \xe2\x80\x98/opt/gitlab/embedded/ssl/certs/\xe2\x80\x99\n}\nnginx[\xe2\x80\x98redirect_http_to_https\xe2\x80\x99] = true\n
Run Code Online (Sandbox Code Playgroud)\n\n我不是 Linux/Unix/git 方面的专家 - 但已经使用 Unix/Linux 大约 30 多年了,并且使用 git 也有很多年了 - 不仅仅是我自己之前用 LFS 设置了 git。
\n我使用的Fedora release 33 (Thirty Three)
Docker 版本是Docker version 20.10.0, build 7287ab3
首先我跑了docker system prune
,从那以后 docker daemon 无法启动。
我运行systemctl start docker
命令并得到
Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.
Run Code Online (Sandbox Code Playgroud)
然后systemctl status docker.service
我得到了
? docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor pr>
Active: failed (Result: exit-code) since Wed 2020-12-09 11:10:58 IST; 15s >
TriggeredBy: ? docker.socket
Docs: …
Run Code Online (Sandbox Code Playgroud) 我试图找到一种访问一组容器的通用方法.除了另一个自定义列表外,我还有一个标准的矢量和列表.
自定义列表定义了一个迭代器;
class Iterator: public std::iterator<std::forward_iterator_tag, T> {
// ...
}
Iterator begin() {
return (Iterator(root));
}
Iterator end() {
return (Iterator(NULL));
}
Run Code Online (Sandbox Code Playgroud)
与适当的运算符重载.
理想情况下,我想这样做;
class Foo {
public:
Foo() {
std::list<int> x;
std::vector<int> y;
custom_list<int> z;
iter = x.begin(); // OR
iter = y.begin(); // OR
iter = z.begin();
// ...
};
private:
std::iterator<int> iter;
};
Run Code Online (Sandbox Code Playgroud)
但显然这些都是不同类型的迭代器.我可以假设所有容器都是相同类型的.
有没有一种优雅的方法来解决这个问题?
在Python中,是否有可能从Bar本身获取包含另一个对象Bar的对象,比如说Foo?这是我的意思的一个例子
class Foo(object):
def __init__(self):
self.bar = Bar()
self.text = "Hello World"
class Bar(object):
def __init__(self):
self.newText = foo.text #This is what I want to do,
#access the properties of the container object
foo = Foo()
Run Code Online (Sandbox Code Playgroud)
这可能吗?谢谢!
STL中是否有分类容器?
我的意思是:我有一个std::vector<Foo>
,Foo
定制的类在哪里.我还有一个比较器,它将比较类的字段Foo
.
现在,我在我的代码中的某个地方:
std::sort( myvec.begin(), myvec.end(), comparator );
Run Code Online (Sandbox Code Playgroud)
它将根据我在比较器中定义的规则对矢量进行排序.
现在我想在Foo
该向量中插入一个class元素.如果可以的话,我想写一下:
mysortedvector.push_back( Foo() );
Run Code Online (Sandbox Code Playgroud)
会发生什么,矢量会根据比较器将这个新元素放到它的位置.
相反,现在我必须写:
myvec.push_back( Foo() );
std::sort( myvec.begin(), myvec.end(), comparator );
Run Code Online (Sandbox Code Playgroud)
这只是浪费时间,因为矢量已经排序,我需要的是适当地放置新元素.
现在,由于我的程序的性质,我不能使用,std::map<>
因为我没有键/值对,只是一个简单的向量.
如果我使用stl::list
,我再次需要在每次插入后调用sort.