这是我的问题:
我有一个std::vector<AguiWidgetBase*>用于跟踪儿童控制的东西.
我有这两个函数来返回迭代器:
std::vector<AguiWidgetBase*>::const_iterator AguiWidgetBase::getChildBeginIterator() const
{
return children.begin();
}
std::vector<AguiWidgetBase*>::const_iterator AguiWidgetBase::getChildEndIterator() const
{
return children.end();
}
Run Code Online (Sandbox Code Playgroud)
然后我像这样使用它:
for(std::vector<AguiWidgetBase*>::const_iterator it = box->getChildBeginIterator();
it != box->getChildEndIterator(); ++it)
{
it->setText("Hello World");
}
Run Code Online (Sandbox Code Playgroud)
我收到这些错误:
Error 3 error C2039: 'setText' : is not a member of 'std::_Vector_const_iterator<_Ty,_Alloc>' c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\main.cpp 112
Error 2 error C2839: invalid return type 'AguiWidgetBase *const *' for overloaded 'operator ->' c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\main.cpp 112
Run Code Online (Sandbox Code Playgroud)
为什么它会给我这些错误?
谢谢
这个问题是关于我想到的数据结构.它是一个动态数组,如C++中的std :: vector <>,除了删除算法不同.
在普通的动态数组中,当一个元素被移除时,所有剩余的元素必须向下移动,即O(n),除非它是最后一个元素,即O(1).
在这一个中,如果删除了任何元素,它将被最后一个元素替换.这当然会失去对元素的排序.但现在删除任何元素都是不变的时间.
列表将具有相同的删除时间,但此结构具有随机访问权限.唯一需要注意的是你不知道你正在访问什么,因为订购可能是混乱的,所以无论如何使用随机访问.另外,列表不会搞乱元素的任何指针/迭代器.
所以,这个结构似乎相当无用,除了严格穿过元素并且可能沿着路径移除它们的非常具体的任务.列表可以执行相同的操作,但这具有更好的缓存性能.
那么,这个奇怪/无用的结构是否有名称,它有什么用途吗?或者只是一个不错的小脑风暴?
以下代码一次读取一个字符的文本文件并将其打印到stdout:
#include <stdio.h>
int main()
{
char file_to_open[] = "text_file.txt", ch;
FILE *file_ptr;
if((file_ptr = fopen(file_to_open, "r")) != NULL)
{
while((ch = fgetc(file_ptr)) != EOF)
{
putchar(ch);
}
}
else
{
printf("Could not open %s\n", file_to_open);
return 1;
}
return(0);
}
Run Code Online (Sandbox Code Playgroud)
但是不是打印到stdout [putchar(ch)]而是想在文件中搜索另一个文本文件中提供的特定字符串,即.strings.txt并输出匹配到out.txt的行
text_file.txt:
1993 - 1999 Pentium 1997 - 1999 Pentium II 1999 - 2003 Pentium III 1998 - 2009 Xeon 2006 - 2009 Intel Core 2
strings.txt:
Nehalem AMD Athlon Pentium
在这种情况下,三个第一text_file.txt行将匹配.我已经对C语言中的文件操作做了一些研究,似乎我可以使用fgetc[像我在我的代码中一样] …
#include<iostream>
using namespace std;
class temp
{
int value1;
public :
void fun() const
{
((temp*)this)->value1 = 10;
}
void print()
{
cout<<value1<<endl;
}
};
int main()
{
temp t;
t.fun();
t.print();
}
Run Code Online (Sandbox Code Playgroud) 我无法找到这个问题的确切答案,因此在此发布.当我想到vector时,它需要在连续的内存位置构建对象.这意味着向量保持内存分配,并且必须对被推入其中的对象进行就地构造(= placement new).这是一个有效的假设吗?此外,这是否意味着容器手动调用析构函数而不是调用delete?我在这里缺少任何其他假设吗?这是否意味着我可以假设,如果我选择写,即使是为对象编写的自定义新内容也可能无法调用?
此外,列表使用new和delete也是有意义的,因为我们不需要连续的内存保证.那么,这种行为是驱动分配器行为的原因吗?请帮忙.谢谢
是std::string.npos以往任何时候都有效吗?(与正确相反std::string::npos.)
我在一个正在研究的旧项目中看到了很多,而且它不能用VS2010编译.
它是否属于标准前的日子?
我有一个空的向量,有些东西填充它,我找不到它.我想设置一个内存断点,以便在发生push_back时程序将中断.
我正在使用Visual Studio 2008,问题是向量在监视窗口中没有显示其内部成员(它似乎有自定义格式).它看起来像这样:
myVector [0]()std :: vector <int,std :: allocator <int >>
指示大小0.任何提示?
在C中获取数组元素的通常方法是这样的:
#define COUNTOF(arr) (sizeof(arr) / sizeof(arr[0]))
Run Code Online (Sandbox Code Playgroud)
这导致了一个整数常量表达式,这也是一个非常好的加法.
问题是它不是类型安全的:int* i; COUNTOF(i); /* compiles :( */.在实践中,这应该很少出现,但为了正确起见,使这种类型安全是很好的.
在C++ 03中这很容易(在C++ 11中它更容易,留给读者练习):
template <typename T, std::size_t N>
char (&countof_detail(T (&)[N]))[N]; // not defined
#define COUNTOF(arr) (sizeof(countof_detail(arr)))
Run Code Online (Sandbox Code Playgroud)
这使用模板推导来获取N数组的大小,然后将其编码为类型的大小.
但是在C中我们没有得到那种语言功能.这是我做的小框架:
// if `condition` evaluates to 0, fails to compile; otherwise results in `value`
#define STATIC_ASSERT_EXPR(condition, value) \
(sizeof(char[(condition) ? 1 : -1]), (value))
// usual type-unsafe method
#define COUNTOF_DETAIL(arr) (sizeof(arr) / sizeof(arr[0]))
// new method:
#define COUNTOF(arr) \
STATIC_ASSERT_EXPR(/* ??? */, \
COUNTOF_DETAIL(arr)) …Run Code Online (Sandbox Code Playgroud) c++ ×7
vector ×3
c ×2
stl ×2
string ×2
visual-c++ ×2
algorithm ×1
arrays ×1
breakpoints ×1
c89 ×1
containers ×1
iterator ×1
search ×1
standards ×1