当我在64位调试配置中构建我们的一个项目时,我有一个奇怪的问题.它似乎产生了一些奇怪的行为,看起来有点像单个迭代器多次递增.我把它缩小到以下测试代码:
#include <omp.h>
#define _HAS_ITERATOR_DEBUGGING 0
#include <vector>
#include <set>
int main(int argc, const char* argv[]) {
std::vector<int> v;
for(int j = 0; j < 20; ++j) {
v.push_back(j);
}
#pragma omp parallel for
for(int i = 0; i < 100000; ++i) {
std::set<int> s;
std::vector<int>::const_iterator begin = v.begin(), end = v.end();
s.insert(begin, end); // after this line s should contain the numbers 0-19
if(s.size() != 20) {
printf("fail\n");
exit(3);
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,大小测试经常失败,这意味着它不会以某种方式插入向量的整个内容 - 并且对它进行大量的调整使得它看起来更像是向量迭代器一次增加多个步骤.这很难说,因为如果用调试器中断,它就不会发生.
绘制的明显结论是它不是线程安全的,但我的理解是它应该是因为唯一修改的变量是s …
我在Python脚本中有一些全局变量.该脚本中的一些函数调用C - 是否可以在C中设置其中一个变量,如果是,如何?
我很欣赏这首先不是一个非常好的设计,但我需要对现有代码进行一些小改动,我不想对现有脚本进行重大的重构.
我用a std::deque
来存储相当多的对象.如果我删除了一堆这些对象,在我看来它的内存使用量并没有减少,与std :: vector类似.
有没有办法减少它?我知道在矢量中你必须使用'交换技巧',我认为它也适用于此,但我宁愿避免使用它,因为它需要复制容器中剩下的所有元素(因此需要你有足够的内存来存储每个对象两次).我并不熟悉deque的实现,但我对它的理解是,有可能在没有大量副本的情况下实现这样的事情(而使用矢量显然不是这样).
我正在使用VC++(Dinkumware)STL,如果这有任何区别的话.
我有一个链表,我想排序的部分,例如:
std::sort(someIterator, otherIterator, predicate);
Run Code Online (Sandbox Code Playgroud)
std :: sort需要随机访问迭代器,因此这种方法不起作用.有一个专门化的std :: list :: sort,但它只能对整个列表进行排序.我认为我没有足够的权限访问列表成员自己写一些东西.
有没有办法做到这一点,而不改变,比如,矢量?
我正在尝试在std :: list上进行双循环以对每对元素进行操作.但是,我在初始化第二个迭代器时遇到了一些麻烦.我想写的代码是:
for(std::list<int>::iterator i = l.begin(); i != l.end(); ++i) {
for(std::list<int>::iterator j = i+1; j != l.end(); ++j) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为列表迭代器不是随机访问,所以你不能做+1.但是我在寻找一个简洁的选择方面遇到了一些麻烦; 编译器对std::list<int>::iterator j(i)++;
我有一些希望似乎并不高兴.实现我想要的东西似乎我将不得不有一些尴尬的额外增量,这将不太适合for循环的结构.
有明显的替代方案(例如使用矢量!)但在我看来应该有一些合理利落的方式来做这个,我现在还没有看到.
在此先感谢任何帮助:)
我在处理C++中重载成员函数的指针时遇到了一个小问题.以下代码编译正常:
class Foo {
public:
float X() const;
void X(const float x);
float Y() const;
void Y(const float y);
};
void (Foo::*func)(const float) = &Foo::X;
Run Code Online (Sandbox Code Playgroud)
但是这不会编译(编译器抱怨重载是不明确的):
void (Foo::*func)(const float) = (someCondition ? &Foo::X : &Foo::Y);
Run Code Online (Sandbox Code Playgroud)
大概这与编译器分离出条件运算符的返回值和函数指针类型有关吗?我可以解决它,但我很想知道规范如何说这一切应该工作,因为它似乎有点不直观,如果有一些方法可以解决它而不会回到5行if-then-else .
我正在使用MSVC++,如果这有任何区别.
谢谢!
我有一个XSLT脚本,我想在每次调用模板时按顺序编号.所以它的缩写版本看起来有点像:
<xsl:call-template name="insertHeader" />
<xsl:for-each ...>
<xsl:call-template name="insertHeader" />
...
</xsl:for-each>
<xsl:call-template name="insertHeader" />
<xsl:template name="insertHeader>
This is item number <xsl:value-of select="$numberOfInvocations />
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
很明显$ numberOfInvocations的东西不起作用,而且在XSLT中你不能增加一个全局计数器变量,这似乎是一种过程语言中的明显方法.我想在第一次调用模板时打印出1,第二次打印出来,等等.我应该怎样做呢?这在XSLT中是否可以远程实现?
谢谢 :)
编辑:所以有一些评论说明这个问题没有明确定义.我想要做的是在(HTML)输出中标记一系列表.我看到这样做最明显的方法是调用一个函数(你可能会告诉我这里不是一个XSLT向导),每次都会自动增加数字.我认为这看起来很难的原因是因为XSLT本身定义了这些表的出现而不是输入.
这个额外的信息可能没那么多用,因为Dimitre的答案让它听起来更像是永远不会起作用.不管怎么说,还是要谢谢你 :)
我有一个对话框,里面有几个大的组合框(每个可能有几百个).在建造这些建筑物的过程中有明显的延迟(通过剖析确认它们是正确的).
我最初的想法是排序正在扼杀它的性能,但是禁用排序并使用InsertString似乎并没有让事情变得更好.我没想到这似乎是一个过多的项目 - 我还应该做些什么还是在这里考虑?
MFC调用是Win32消息调用的简单包装器,所以我认为没有任何显着的开销.
DUPLICATE 如何尽可能快地将大量字符串加载到MFC组合框控件中?
我正在使用 Python C API 从我的应用程序调用 Python 函数。我想提供一个可以调用的函数列表,并希望能够将此列表限制为具有预期参数数量的函数。
我很高兴我可以遍历字典来提取函数列表并用于PyCallable_Check
确定它们是否可调用,但我不确定如何找出每个函数期望的参数数量?
我发现了一种涉及 Boost::Python 的技术,但我宁愿不添加它,因为(我希望!)将是一个小添加。
谢谢 :)
我在UnitTest ++中编写了一些单元测试,并希望编写一些共享一些公共资源的测试.我认为这应该通过他们的TEST_FIXTURE设置工作,但似乎是为每个测试构建一个新的夹具.示例代码:
#include <UnitTest++.h>
struct SomeFixture {
SomeFixture() {
// this line is hit twice
}
};
TEST_FIXTURE(SomeFixture, FirstTest) {
}
TEST_FIXTURE(SomeFixture, SecondTest) {
}
Run Code Online (Sandbox Code Playgroud)
我觉得我必须做错事; 我曾经认为拥有夹具的重点是设置/拆卸代码只发生一次.我错了吗?还有什么我需要做的才能让它以这种方式工作吗?
c++ ×7
stl ×4
c ×2
python ×2
64-bit ×1
deque ×1
iterator ×1
mfc ×1
performance ×1
unit-testing ×1
unittest++ ×1
visual-c++ ×1
winapi ×1
xslt ×1