相关疑难解决方法(0)

我什么时候应该使用std :: size_t?

我只是想知道我应该使用std::size_tfor循环和东西而不是int?例如:

#include <cstdint>

int main()
{
    for (std::size_t i = 0; i < 10; ++i) {
        // std::size_t OK here? Or should I use, say, unsigned int instead?
    }
}
Run Code Online (Sandbox Code Playgroud)

一般来说,何时使用的最佳做法是什么std::size_t

c++ types idiomatic size-t loop-counter

187
推荐指数
9
解决办法
9万
查看次数

size_type可以大于std :: size_t吗?

标准容器,std::allocatorsize_type定义为std::size_t.但是,是否可以使用分配器来分配大小无法用size_t?表示的对象?换句话说,可以size_type永远大于size_t

c++ stl size-t allocator

36
推荐指数
4
解决办法
2341
查看次数

size_t vs C++和/或C中的int

为什么在C++容器中,它返回的是size_type而不是int?如果我们正在创建自己的结构,我们是否也应该鼓励使用size_type

c c++ size-type

29
推荐指数
3
解决办法
3万
查看次数

C++ for-loop - size_type vs. size_t

C++ Primer第3章的书中,有以下for循环将向量中的元素重置为零.

for (vector<int>::size_type ix = 0; ix ! = ivec.size(); ++ix)
ivec[ix] = 0;
Run Code Online (Sandbox Code Playgroud)

它为什么用vector<int>::size_type ix = 0?我们不能说int ix = 0吗?在第二种形式上使用第一种形式有什么好处?

谢谢.

c++ for-loop vector size-type

17
推荐指数
3
解决办法
2万
查看次数

所有不同尺寸类型如何相互关联?

目前我有一个场景,我想检查将给定字符串写入文件流是否会使文件超出给定大小(这用于日志文件轮换).现在,std::ofstream::tellp()返回一个streampos,但std::string::size()返回一个size_t.结果是,这不起作用:

out_stream.tellp() + string.size() < limit
Run Code Online (Sandbox Code Playgroud)

因为operator +这些类型显然存在模糊的重载.这引出了两个问题:

  1. 如何解决上述歧义?
  2. 如何各种不同类型的(size_t,streamsize,streampos,streamoff)之间的相互关系?什么时候可以安全地转换,以及可能存在的陷阱.我对这些类型感到困惑.我所知道的是,它们是依赖于实现的,并且它们提供了某些保证(例如size_t,总是足够大以容纳大型对象的大小,该大小对象将适合编译应用程序的体系结构的内存),但是它们是什么关于这些类型的互操作性的保证(参见上面的例子,或比较a streamsize到a size_t)?

c++ size-type

8
推荐指数
1
解决办法
2324
查看次数

什么时候需要在C++中使用decltype

我正在学习C++,并在C++入门中找到了以下代码:

int main() {

string s("some string");
for(decltype(s.size()) index = 0; index != s.size() && !isspace(s[index]); ++index)
    s[index] = toupper(s[index]);

cout << s;
Run Code Online (Sandbox Code Playgroud)

}

我理解代码大写字符串中的第一个单词,输出是

SOME string
Run Code Online (Sandbox Code Playgroud)

我很好奇的是,为什么你需要使用decltype(s.size())声明索引的类型.如果我将其更改为int index =0,代码仍然编译并运行没有问题.我似乎更容易使用int.我想我在这里缺少一些导入概念,任何反馈都会非常有用.谢谢!

c++

7
推荐指数
1
解决办法
527
查看次数

Stroustrup并在循环中溢出size_type

我正在阅读Bjarne Stroustrup撰写的"使用C++编程原理和实践",我需要澄清一下我在第25.5.3节中找到的令人惊讶的一点.作者声称,如果我们想迭代一个std::vector,那么使用一个循环变量

for (vector<int>::size_type i = 0; i < v.size(); ++i)
Run Code Online (Sandbox Code Playgroud)

比使用vector类的迭代器安全性更低:

for (vector<int>::iterator p = v.begin(); p != v.end(); ++p)
Run Code Online (Sandbox Code Playgroud)

因为,是无符号类型,i可能会溢出.他声明使用迭代器的循环没有这样的限制.我有点困惑,因为我知道size_type保证足够大以代表最大可能的向量,所以类型的变量size_type永远不会在这样的循环中溢出.

编辑

更具体地说,他提出了一个int在其他两个之前使用类型的循环变量的示例,然后在最后他说:

" size_type保证是无符号的,所以第一个(无符号整数)形式比int上面的版本多一个比特.这可能很重要,但它仍然只给出一个比特的范围(加倍迭代次数)使用迭代器的循环没有这样的限制."

vector<T>::size()归还vector<T>::size_type?我没有看到任何限制.

c++ iterator size-type

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

过载下标运算符不返回指针

在我的班级中,我有一个成员变量std::vector<node*>子项
我想重载下标运算符,以便我可以轻松索引其中一个节点.


这是我的班级减速功能:

node* operator[](int index);  
Run Code Online (Sandbox Code Playgroud)

这是我对该函数的类定义:

node* class_name::operator[](int index){

    return children[index];
}  
Run Code Online (Sandbox Code Playgroud)

但是,这个函数似乎没有像我希望的那样返回指针.
这是给我带来麻烦的功能:

void Print_Tree(node* nptr, unsigned int & depth){

    if (NULL == nptr) {
        return;
    }
      //node display code

    for (int i = 0; i < nptr->Number_Of_Children(); ++i){
        Print_Tree(nptr[i],depth+1); //<- Problem Here!
    }
     //node display code

    return;
}  
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

错误:在递归调用时无法将"node"转换为"node*"

我不明白为什么当我想要一个指向节点的指针时它会给我一个节点.
我的重载功能有问题吗?
我尝试在递归调用中取消引用该节点:

Print_Tree(*nptr[i],depth+1);  
Print_Tree(*(nptr[i]),depth+1);
Print_Tree(nptr->[i],depth+1);
Run Code Online (Sandbox Code Playgroud)

无济于事!

我究竟做错了什么?

c++ pointers class operator-overloading c++11

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

保证std :: container :: size_type是std :: size_t

下面这个问题,我决定使用std::size_t作为size_type每一个容器,明显可读性的原因.我知道理论上可能std::container<T>::size_type不是std::size_t,但我认为现在和未来的配置并非如此.

但是,为了避免邪恶的错误,我在使用时检查类型是否相同.例如:

BOOST_STATIC_ASSERT(boost::is_same< std::vector<double>::size_type , std::size_t >::value);
std::vector<double> x;
/* fill x */
for(std::size_t i = 0; i < x.size(); ++i) { /* do something */ }
Run Code Online (Sandbox Code Playgroud)

在代码中的另一个地方,我用了一个std::vector<long int>,然后我也检查:

BOOST_STATIC_ASSERT(boost::is_same< std::vector<long int>::size_type , std::size_t >::value);
Run Code Online (Sandbox Code Playgroud)

然后,哦不!我用std::vector<std::list<std::string>*>std::vector<std::list<double*>*>,然后我检查:

BOOST_STATIC_ASSERT(boost::is_same< std::vector<std::list<std::string>*>::size_type , std::size_t >::value);
BOOST_STATIC_ASSERT(boost::is_same< std::vector<std::list<double*>*>::size_type , std::size_t >::value);
Run Code Online (Sandbox Code Playgroud)

好的,我想你明白了这个问题.线条难看,难以维护代码.这是个坏主意.

然后,我的问题是:如果我检查std::vector<any_common_type>::size_typestd::size_t,是否有任何机会std::vector<another_type>::size_type不是std::size_t?只检查分离文件中的一些常见类型以确保std::container::size_type始终std::size_t在我的编译器上是否足够?

注意:出于兼容性原因,我不使用C++ 11.

c++ stl size-t size-type c++03

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

我应该在我的代码中使用size_type吗?

我有一组不同类型的容器,每个容器都与一个字符串id相关联.如果关联的容器不为空,则以下函数应打印id.

如果我想将std :: vector的大小传递给函数,我应该将它作为size_type对象传递吗?像这样:

void printIfNotEmpty(const std::string& id, size_type sizeOfContainer)
{
   if(sizeOfContainer)
   {
     output << id << " is not empty";
   }
   else
   {
     output << id << " is empty";
   }
}
Run Code Online (Sandbox Code Playgroud)

如果是这样,size_type在什么命名空间中?如何在代码中包含其定义?

也许这是一个解决方案:

template<class T>
void printIfNotEmpty(const std::string& id, const T& container)
{
  if(container.size())
  {
     output << id << " is not empty";
  }
  else
  {
     output << id << " is empty";
  }
}
Run Code Online (Sandbox Code Playgroud)

c++

3
推荐指数
1
解决办法
618
查看次数

在编译时选择size_t和container :: size_type

我想在一个代码块中选择数据类型更迂腐,我需要在一般情况下或容器类型之间进行选择.我的问题是,如果我有以下代码块,我不知道该怎么做.有人可以帮忙吗?size_type size_tcontainer::size_type

template<typename some_container>
int func(some_container& input)
{
    //Some code...
    //...
    decltype(input.size()) variable_x; //Choose this if defined,
    size_t                 variable_x; //otherwise choose this
    //... Some more code...
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,some_container可能是自定义容器,但不提供size()功能.是什么使我这个想法是读之间的区别size_t,并container::size_type为size_t VS容器:: size_type的.我还在编译时读取确定类型是否是STL容器,但对于我的情况,这种方法感觉有点笨拙.

c++ type-traits size-type c++11 visual-studio-2012

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

正确使用vector&lt;int&gt;::size_type

我在一些关于 C++ 的著名书籍中看到——

vector<int> ivec;

for (vector<int>::size_type i = 0; i != 10; ++i) {
    ivec.push_back(i);
    ivec.push_back(i);  // duplicate copies of each number

}
Run Code Online (Sandbox Code Playgroud)

我想知道为什么vector<int>::size_type在这里使用。他们没有i与向量的大小进行比较。int目的是在向量中插入 10 ,所以这int i = 0是正确的做法,不是吗?

vector<int>::size_type将为,而 又将为typedef,但这里我们将' 存储在 中。std::size_tunsinged intintvector

请澄清我的理解vector<int>::size_type。在上面的 for 循环中使用它公平吗?

c++ c++11

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