小编GMa*_*ckG的帖子

指针向量的迭代器没有正确解除引用

这是我的问题:

我有一个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++ iterator vector

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

动态数组,O(1)删除任何元素

这个问题是关于我想到的数据结构.它是一个动态数组,如C++中的std :: vector <>,除了删除算法不同.

在普通的动态数组中,当一个元素被移除时,所有剩余的元素必须向下移动,即O(n),除非它是最后一个元素,即O(1).

在这一个中,如果删除了任何元素,它将被最后一个元素替换.这当然会失去对元素的排序.但现在删除任何元素都是不变的时间.

列表将具有相同的删除时间,但此结构具有随机访问权限.唯一需要注意的是你不知道你正在访问什么,因为订购可能是混乱的,所以无论如何使用随机访问.另外,列表不会搞乱元素的任何指针/迭代器.

所以,这个结构似乎相当无用,除了严格穿过元素并且可能沿着路径移除它们的非常具体的任务.列表可以执行相同的操作,但这具有更好的缓存性能.

那么,这个奇怪/无用的结构是否有名称,它有什么用途吗?或者只是一个不错的小脑风暴?

algorithm data-structures

5
推荐指数
1
解决办法
2660
查看次数

每个C++程序员都应该阅读ISO标准才能变得专业吗?

每个C++程序员都应该阅读ISO标准才能变得专业吗?

c++

5
推荐指数
3
解决办法
719
查看次数

在文本文件C中搜索字符串

以下代码一次读取一个字符的文本文件并将其打印到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[像我在我的代码中一样] …

c string search

5
推荐指数
1
解决办法
6万
查看次数

为什么即使在const函数中值也会改变?

#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)

c++

5
推荐指数
2
解决办法
186
查看次数

STL容器分配放置新

我无法找到这个问题的确切答案,因此在此发布.当我想到vector时,它需要在连续的内存位置构建对象.这意味着向量保持内存分配,并且必须对被推入其中的对象进行就地构造(= placement new).这是一个有效的假设吗?此外,这是否意味着容器手动调用析构函数而不是调用delete?我在这里缺少任何其他假设吗?这是否意味着我可以假设,如果我选择写,即使是为对象编写的自定义新内容也可能无法调用?

此外,列表使用new和delete也是有意义的,因为我们不需要连续的内存保证.那么,这种行为是驱动分配器行为的原因吗?请帮忙.谢谢

c++ containers stl vector placement-new

5
推荐指数
1
解决办法
2976
查看次数

std :: string.npos有效性

std::string.npos以往任何时候都有效吗?(与正确相反std::string::npos.)

我在一个正在研究的旧项目中看到了很多,而且它不能用VS2010编译.

它是否属于标准前的日子?

c++ string standards

5
推荐指数
2
解决办法
1189
查看次数

C++中结构引用的默认参数

我想给函数参数赋一个默认值,该参数是对结构的引用.我可以提供什么作为默认值?

c++

5
推荐指数
2
解决办法
8795
查看次数

如何设置vector <int>长度增加时的断点?

我有一个空的向量,有些东西填充它,我找不到它.我想设置一个内存断点,以便在发生push_back时程序将中断.

我正在使用Visual Studio 2008,问题是向量在监视窗口中没有显示其内部成员(它似乎有自定义格式).它看起来像这样:

myVector [0]()std :: vector <int,std :: allocator <int >>

指示大小0.任何提示?

c++ stl breakpoints vector visual-c++

5
推荐指数
1
解决办法
1982
查看次数

是否有一种类型安全的方法来获取C中的数组元素?

在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 arrays c89 visual-c++

5
推荐指数
1
解决办法
389
查看次数