javascript

git

java

python

git-remote

reactjs

c++

github

django

c#

.net

.net-framework-version

operators

git-fetch

typescript

user-experience

chmod

css

content-type

variables

最好的方法是将两个键与std :: map一起使用?

我有一个std :: map,用于存储x和y坐标的值。 我的数据非常稀疏,所以我不想使用数组或向量,这将导致大量内存浪费。 我的数据范围从-250000到250000,但最多只有几千点。

目前,我正在使用两个坐标(即“ 12x45”)创建std :: string并将其用作键。 这似乎不是最好的方法。

我的其他想法是使用int64并将两个int32推入其中,并将其用作键。

或者使用带有两个坐标的类。 对用作键的类有什么要求?

做这个的最好方式是什么? 我宁愿不使用地图。

trans by 2020-08-07T12:47:29Z

为什么没有将向量访问运算符指定为noexcept?

为什么没有将std::vectoroperator[]frontback成员函数指定为noexcept

trans by 2020-08-07T05:02:43Z

我应该使用std :: for_each吗?

我一直在尝试更多地了解我使用的语言(不同的样式,框架,模式等)。 我注意到我从未使用过[](int n),所以我认为也许应该开始。 在这种情况下,我们的目标是扩大思想范围,而不是在某种程度上改善代码(可读性,表达性,紧凑性等)。

因此,考虑到这种情况,最好将29987398581197219721984用于简单的任务,例如打印矢量:

for_each(v.begin(), v.end(), [](int n) { cout << n << endl; }

[](int n)是lambda函数)。 代替:

for(int i=0; i<v.size(); i++) { cout << v[i] << endl; }

我希望这个问题似乎没有意义。 我猜这几乎要问一个更大的问题...中级程序员是否应该使用语言功能,即使他此时实际上并不需要,但只是为了使他可以在一段时间内更好地理解该功能,而这实际上可能会从中受益匪浅 它。 尽管可能已经问过了这个更大的问题(例如此处)。

trans by 2020-08-06T01:15:43Z

如何删除const_iterator的常数?

作为此问题的扩展,const_iterator更快吗?我在const_iterator上还有另一个问题。如何删除const_iterator的常数?尽管迭代器是指针的通用形式,但const_iteratoriterator还是两回事。 因此,我相信,我也无法使用const_cast<>const_iterator转换为iterator

一种方法是定义一个迭代器,该迭代器将移动直到const_iterator指向的元素。 但这似乎是线性时间算法。

关于实现此目标的最佳方法的任何想法?

trans by 2020-08-05T11:58:15Z

C ++ STL map ::擦除不存在的密钥

关于C ++ STL映射,请按以下键擦除:

 size_type map::erase ( const key_type& x );

删除不存在的密钥是否合法? 即下面的代码片段还可以吗?

map<char,int> mymap;
mymap['c']=30;
mymap.erase('c');
mymap.erase('c');
mymap.erase('D');

干杯

trans by 2020-08-03T13:40:07Z

什么是std :: pair?

std::pair的用途是什么,我为什么要使用它?boost::compressed_pair带来什么好处?

trans by 2020-08-01T17:31:12Z

stl-C ++中的有效链表?

该文件说std::list效率低下:

std :: list是效率极低的类,很少使用。 它为插入其中的每个元素执行堆分配,因此具有非常高的常数因子,尤其是对于较小的数据类型。

评论:这令我惊讶。 std::list是一个双链表,因此尽管其元素构造效率不高,但它支持O(1)时间复杂度的插入/删除,但是在此引用的段落中完全忽略了此功能。

我的问题:假设我需要一个用于存放小型均质元素的顺序容器,并且该容器应支持O(1)复杂度的元素插入/删除操作,并且不需要随机访问(尽管支持随机访问是不错的选择,但这不是必须的 这里)。 我也不希望堆分配为每个元素的构造引入高常数因子,至少在元素数量很少的情况下。 最后,仅当删除相应的元素时,迭代器才应无效。 显然,我需要一个自定义的容器类,它可能是(也可能不是)双向链表的变体。 我应该如何设计这个容器?

如果上述规范无法实现,那么也许我应该有一个自定义的内存分配器,例如凹凸指针分配器? 我知道std::list将分配器作为其第二个模板参数。

编辑:从工程的角度来看,我知道我不应该太在意这个问题-足够快就足够了。 这只是一个假设的问题,因此我没有更详细的用例。 随意放松一些要求!

Edit2:我了解O(1)复杂度的两种算法由于其恒定因子的不同而可能具有完全不同的性能。

trans by 2020-08-01T13:36:53Z

C ++-size_t vs int警告

我总是收到以下代码类型的警告。

std::vector v;
for ( int i = 0; i < v.size(); i++) {
}

size()

我知道size()返回size_t,只是想知道是否可以忽略此警告,还是应该将所有类型为size_t的循环变量

trans by 2020-07-29T01:07:17Z

STL映射是否在插入时初始化原始类型?

我有wstrPlayerName像这样:

map<wstring,int> Scores;

它存储玩家的姓名和分数。 当有人得到分数时,我会简单地做:

Scores[wstrPlayerName]++;

如果映射中没有带键2984473779591709709696的元素,它将创建一个,但是会在增量之前将其初始化为零或null还是未定义?

是否应该在每次递增之前测试元素是否存在?

我只是想知道,因为我认为原始类型的东西在创建时总是不确定的。

如果我写这样的话:

int i;
i++;

编译器警告我未定义,并且在我运行程序时通常不为零。

trans by 2020-07-27T05:03:51Z

C ++ std :: vector emplace vs ins

这个问题已经在这里有了答案:

  • push_back和emplace_back 6个答案

我想知道两者之间有什么区别。 我注意到emplace是c ++ 11的加法。 那么为什么要加法呢?

trans by 2020-07-26T04:43:24Z

将迭代器转换为指针?

我有一个findunordered_set<std::vector*>元素。 现在,我需要将指针传递给具有最后n-1个元素的向量。

例如,我的find包含unordered_set<std::vector*>。一个函数需要n-1,我想将其传递给foo的指针。

我可以(安全地)使用迭代器find,将其转换为指针并将其传递给函数吗? 还是使用unordered_set<std::vector*>

更新:人们建议我将函数更改为采用迭代器而不是指针。 在我的情况下,这似乎是不可能的,因为我提到的函数是unordered_set<std::vector*>find函数。那么在这种情况下,是将foo中的n-1个元素复制到一个新的向量中,并使用指向该唯一选项的指针调用find吗? 效率很低! 就像画家Shlemiel一样,尤其是因为我必须查询许多子集:最后的n-1,然后是n-2等元素,然后查看它们是否在unordered_set中。

trans by 2020-07-24T03:24:29Z

c ++ 11-lambda像C ++中的函数一样内联吗?

编译器是否可以内联lambda函数来提高效率,就像使用简单的标准函数一样?

例如

std::vector<double> vd;
std::for_each(vd.begin(), vd.end(), [](const double d) {return d*d;});

还是由于缺乏优化而导致效率降低?

第二个问题:在哪里可以检查我使用的编译器是否优化了内联函数的调用,这些调用已发送给算法? 我的意思是,如果将一个函数而不是一个函数对象发送给算法,则最后一个获取指向该函数的指针,而某些编译器会优化指向内联函数的指针,而其他编译器则不会。

trans by 2020-07-24T02:16:10Z

C ++-STL向量:移动所有元素

我有两个STL向量Bk*O(N),我想清除k的所有元素,然后将N的所有元素移至max(size_of(A), size_of(B)),然后清除A。简而言之,我要这样做:

std::vector<MyClass> A;
std::vector<MyClass> B;
....
A = B;
B.clear();

由于B可能很长,因此需要k*O(N)来执行此操作,其中k是一个常数,而Nmax(size_of(A), size_of(B))。我想知道是否有一种更有效的方法。 我想到的一件事是将AB定义为指针,然后在恒定时间内复制指针并清除B

trans by 2020-07-22T02:10:33Z

C ++-对std :: runtime_error与std :: logic_感到困惑

我最近看到,如果命令行输入不可解析,boost program_options库将抛出runtime_error。 这挑战了我对logic_errorruntime_error的假设。

我以为逻辑错误(runtime_error及其派生类)是由于内部无法遵守程序不变性而导致的问题,通常是内部API的非法参数形式。 从这个意义上讲,它们在很大程度上与ASSERT等效,但是意在用于已发布的代码中(与通常不会编译为已发布的代码的ASSERT不同)。它们在无法在调试/测试版本中集成单独的软件组件的情况下非常有用。 或失败的后果是如此重要,必须向用户提供有关无效不变条件的运行时反馈。

同样,我认为runtime_errors完全是由程序员无法控制的运行时条件造成的:I / O错误,无效的用户输入等。

但是,program_options显然被大量(主要是?)用作解析最终用户输入的手段,因此在我的思维模型下,如果输入错误,则肯定应该抛出runtime_error

我要去哪里错了? 您是否同意异常类型的提升模型?

trans by 2020-07-21T03:26:12Z

算法-如何从C ++容器中获取随机元素?

从STL范围中获取[伪]随机元素的好方法是什么?

我能想到的最好的方法是做std::random_shuffle(c.begin(), c.end()),然后从const中选取我的随机元素。

但是,我可能希望从const容器中获得一个随机元素,或者我可能不希望完全洗牌的费用。

有没有更好的办法?

trans by 2020-07-19T13:15:29Z

为什么在C ++ 11或C ++ 14中没有安置迭代器?

C ++ 98具有front_inserterback_inserterinserter,但C ++ 11或C ++ 14草案中似乎没有这些版本的任何安装版本。 是否有任何技术原因无法提供front_emplacerback_emplaceremplacer

trans by 2020-07-14T13:34:42Z

使用C ++ / STL的“正确”方式存储二进制数据

通常,在C ++中存储二进制数据的最佳方法是什么? 据我所知,这些选项几乎归结为使用字符串或vector <char> s。 (由于我专门指的是C ++,因此我将忽略char * s和malloc()的可能性)。

通常,我只使用一个字符串,但是我不确定是否遗漏了开销,或者STL在内部进行的转换可能会干扰二进制数据的完整性。 有人对此有任何指点(har)吗? 建议或偏爱的一种或另一种方式?

trans by 2020-07-14T09:46:26Z

c ++-hash_map和unordered_map之间的区别?

我最近发现,在C ++中实现哈希映射的实现将称为hash_map

当我查找为什么他们不仅仅使用hash_map时,我发现unordered_map的实现显然存在兼容性问题,而unordered_map解决了unordered_map(此处有更多信息)。

该Wiki页面没有提供更多信息,所以我想知道是否有人知道unordered_map解决了unordered_map的某些问题。

trans by 2020-07-14T01:36:08Z

调用std :: vector :: clear()会将std :: vector :: capacity()设置为零吗?

如果我在矢量上使用.reserve(items),则矢量将为我对所需物品数量的猜测分配足够的内存。

如果我以后使用.clear(),那会清除该向量还是保存我之前定义的储备?

谢谢。

trans by 2020-07-13T17:55:13Z

如何更改C ++ STL的特定元素

vector<int> l;
for(int i=1;i<=10;i++){
   l.push_back(i);
}

现在,例如,如何将向量的l.at(i)更改为-1

我尝试了l.at(i)它的行为不符合预期。 其他矢量方法似乎都不适合。

我使用了vector,因为我需要在代码中使用随机访问功能(使用l.at(i))。

trans by 2020-07-12T22:11:37Z

1 2 3 4 5 6 7 8 9 10 11 下一页 共11页