相关疑难解决方法(0)

如何在C++中使用数组?

C++从C继承了数组,几乎无处不在.C++提供了易于使用且不易出错的抽象(std::vector<T>自C++ 98和C++ 11std::array<T, n>以来),因此对数组的需求并不像在C中那样频繁出现.但是,当您阅读遗产时代码或与用C编写的库交互,你应该牢牢掌握数组如何工作.

本FAQ分为五个部分:

  1. 类型级别的数组和访问元素
  2. 数组创建和初始化
  3. 赋值和参数传递
  4. 多维数组和指针数组
  5. 使用数组时常见的陷阱

如果您觉得此常见问题解答中缺少重要内容,请写下答案并将其作为附加部分链接到此处.

在下文中,"数组"表示"C数组",而不是类模板std::array.假定了C声明符语法的基本知识.请注意,面对异常,手动使用newdelete如下所示是非常危险的,但这是另一个常见问题解答的主题.

(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)

c++ arrays pointers c++-faq multidimensional-array

469
推荐指数
5
解决办法
12万
查看次数

迭代器循环与索引循环

可能重复:
为什么使用迭代器而不是数组索引?

我正在回顾我对C++的了解,我偶然发现了迭代器.我想知道的一件事是什么让它们如此特别,我想知道为什么:

using namespace std;

vector<int> myIntVector;
vector<int>::iterator myIntVectorIterator;

// Add some elements to myIntVector
myIntVector.push_back(1);
myIntVector.push_back(4);
myIntVector.push_back(8);

for(myIntVectorIterator = myIntVector.begin(); 
        myIntVectorIterator != myIntVector.end();
        myIntVectorIterator++)
{
    cout<<*myIntVectorIterator<<" ";
    //Should output 1 4 8
}
Run Code Online (Sandbox Code Playgroud)

比这更好:

using namespace std;

vector<int> myIntVector;
// Add some elements to myIntVector
myIntVector.push_back(1);
myIntVector.push_back(4);
myIntVector.push_back(8);

for(int y=0; y<myIntVector.size(); y++)
{
    cout<<myIntVector[y]<<" ";
    //Should output 1 4 8
}
Run Code Online (Sandbox Code Playgroud)

是的,我知道我不应该使用std命名空间.我刚把这个例子从cprogramming网站上删除了.那么请你告诉我为什么后者更糟?有什么大不同?

c++ indexing iterator loops c++11

100
推荐指数
4
解决办法
16万
查看次数

"std :: size_t"在C++中有意义吗?

在一些代码,我继承,我看到经常使用size_tstd命名空间限定词.例如:

std::size_t n = sizeof( long );
Run Code Online (Sandbox Code Playgroud)

当然,它编译并运行良好.但对我来说这似乎是不好的做法(也许是从C继承下来的?).

是不是真的size_t是内置到C++中,因此在全局命名空间中?是否需要size_t在C++中使用头文件?

提出这个问题的另一种方法是,是否需要在所有C++编译器上编译以下程序(没有包含)?

size_t foo()
{
    return sizeof( long );
}
Run Code Online (Sandbox Code Playgroud)

c++ size-t

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

为什么int和而不是unsigned int用于C和C++ for循环?

这是一个相当愚蠢的问题,但为什么int常用而不是unsigned int在C或C++中为数组定义for循环时?

for(int i;i<arraySize;i++){}
for(unsigned int i;i<arraySize;i++){}
Run Code Online (Sandbox Code Playgroud)

我认识到int在进行数组索引以外的操作时使用的好处以及使用C++容器时迭代器的好处.是不是因为在循环数组时无关紧要?或者我应该一起避免它并使用不同的类型,如size_t

c int unsigned for-loop

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

为什么shared_ptr <T> :: use_count()返回long而不是unsigned类型?

shared_ptr观察者20.8.2.2.5 C++ 14最终草案(n4296)

   long use_count() const noexcept;
Run Code Online (Sandbox Code Playgroud)

返回:共享所有权的shared_ptr对象数,或者为空时为0 .*this*this*this

[注意:use_count()效率不一定. - 结束说明]

c++ shared-ptr c++14

23
推荐指数
2
解决办法
784
查看次数

如何检查字符串是否以.txt结尾

我正在学习基本的C++,现在我从用户那里得到了一个字符串,我想检查他们是否输入了整个文件名(包括.txt).我有字符串,但如何检查字符串是否以".txt"结尾?

string fileName;

cout << "Enter filename: \n";
cin >> fileName;

string txt = fileName.Right(4);
Run Code Online (Sandbox Code Playgroud)

Right(int)方法仅适用于CString,因此上述代码不起作用.如果可能的话,我想使用常规字符串.有任何想法吗?

c++ string

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

在使用STL容器时,我应该使用int还是unsigned int?

请参阅本指南:http:
//google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone = Integer_Types #Integer_Types

谷歌建议int大部分时间使用.
我尝试遵循本指南,唯一的问题是STL容器.

例如:
1.

void SetElement(int Index, int Value)
{
    if (Index > Vector.size()) return;
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果我用intIndex,我得到了一个警告这里.

2.

for (int i = 0; i < Vector.size(); ++i)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

说到循环计数器,同样的警告.

如果我声明Indexiunsigned int它传播,我必须声明更多变量,unsigned int并且不会有一致性.

我能想到的最好的方法是使用像:
if (Index > static_cast<int>(Vector.size()) ...或者
for (int i = 0; i < static_cast<int>(Vector.size()); ++i) ...
我真的不喜欢演员.

有建议的方法吗?

PS
还有更多的理由比链接给出的for循环示例.
要仅使用有符号整数,我可以避免有符号/无符号警告,强制转换,
并确保每个值都可以是负数(为了保持一致),
并且我总是可以使用-1作为无效值. …

c++ warnings integer stl casting

13
推荐指数
1
解决办法
7227
查看次数

为什么这个if条件失败用于比较负整数和正整数

#include <stdio.h>

int arr[] = {1,2,3,4,5,6,7,8};
#define SIZE (sizeof(arr)/sizeof(int))

int main()
{
        printf("SIZE = %d\n", SIZE);
        if ((-1) < SIZE)
                printf("less");
        else
                printf("more");
}
Run Code Online (Sandbox Code Playgroud)

编译后的输出gcc"more".为什么if条件,即使失败-1 < 8

c c++ comparison signed if-statement

7
推荐指数
4
解决办法
6381
查看次数

C++ vector :: size_type:signed vs unsigned; int与long

我一直在通过在不同平台上编译来对我的应用程序进行一些测试,而从64位系统向32位系统的转变暴露了许多问题.

我大量使用向量,字符串等,因此需要对它们进行计数.但是,我的函数也使用32位无符号数,因为在很多情况下我需要显式地使用正整数.

我遇到了看似简单的任务的问题,例如std::minstd::max,这可能更系统化.请考虑以下代码:

uint32_t getmax()
{
    return _vecContainer.size();
}
Run Code Online (Sandbox Code Playgroud)

看起来很简单:我知道向量不能有负数的元素,所以返回无符号整数就完全有道理了.

void setRowCol(const uint32_t &r_row; const uint32_t &r_col)
{
    myContainer_t mc;
    mc.row = r_row;
    mc.col = r_col;
    _vecContainer.push_back(mc);
}
Run Code Online (Sandbox Code Playgroud)

再次,简单.

问题:

uint32_t foo(const uint32_t &r_row)
{
    return std::min(r_row, _vecContainer.size());
}
Run Code Online (Sandbox Code Playgroud)

这给了我错误,例如:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/algorithm:2589:1: note: candidate template ignored: deduced conflicting types for parameter '_Tp' ('unsigned long' vs. 'unsigned int')
min(const _Tp& __a, const _Tp& __b)
Run Code Online (Sandbox Code Playgroud)

我做了很多挖掘,在一个平台上,vector :: size_type是一个8字节的数字.但是,根据设计,我使用无符号的4字节数字.这可能会导致事情变得古怪,因为您无法隐式地将8字节数转换为4字节数.

解决方案是做老式的weay:

#define MIN_M(a,b) a < b ? a : b
return …
Run Code Online (Sandbox Code Playgroud)

c++ vector multiplatform long-integer

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

有符号和无符号整数表达式与0x80000000之间的比较

我有以下代码:

#include <iostream>

using namespace std;

int main()
{
    int a = 0x80000000;
    if(a == 0x80000000)
        a = 42;
    cout << "Hello World! :: " << a << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是

Hello World! :: 42
Run Code Online (Sandbox Code Playgroud)

所以比较有效.但是编译器告诉我

g++ -c -pipe -g -Wall -W -fPIE  -I../untitled -I. -I../bin/Qt/5.4/gcc_64/mkspecs/linux-g++ -o main.o ../untitled/main.cpp
../untitled/main.cpp: In function 'int main()':
../untitled/main.cpp:8:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if(a == 0x80000000)
             ^
Run Code Online (Sandbox Code Playgroud)

所以问题是:为什么0x80000000是unsigned int?我可以以某种方式签名以摆脱警告吗?

据我所知,0x80000000将是INT_MIN,因为它超出正整数的范围.但为什么编译器会假设我想要一个正数?

我正在使用linux上的gcc版本4.8.1 20130909进行编译.

c++

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

使用`size_t`表示长度会影响编译器优化?

在阅读这个问题时,我看到第一条评论说:

size_t 对于长度不是一个好主意,正确的类型是签名的优化/ UB原因.

其次是支持推理的另一条评论.这是真的吗?

这个问题很重要,因为如果我要写一个矩阵库,图像尺寸可能是size_t,只是为了避免检查它们是否为负数.但是所有循环都会自然而然地使用size_t.这会对优化产生影响吗?

c++ compiler-optimization

4
推荐指数
1
解决办法
285
查看次数

跨越字符串的初始化并跳转到标签大小写

我正在尝试为我的程序做案例菜单。我总是收到交叉初始化错误,我以前从未见过这个错误。也许有人可以向我解释我的代码出了什么问题。

#include <iostream>
#include <cstdlib>
#include <string>
#include <sstream>
#include <stdlib.h>
#include <fstream>

using namespace std;

#define N_CARS 1

struct car{
    string model;
    int year;
    double price;
    bool available;
}cars [N_CARS];


void menu();
void mainMenu();

void writeToFile(ofstream &outputFile , const car& p)
{
    outputFile << p.model << " "
               << p.year << " "
               << p.price << " "
               << p.available<<"\n";
}

int choice1 = 0;


int main(int argc, char** argv) {

    menu();
    return 0;
}


void menu() {

    do …
Run Code Online (Sandbox Code Playgroud)

c++ menu switch-statement

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

为什么C ++ STL使用unsigned in size()函数?

我在使用这样的循环时遇到了一个问题,

//vector<int> sides;
for (int i = 0; i < sides.size()-2; i++) {
  if (sides[i] < sides[i+1] + sides[i+2]) {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

问题是size()方法使用无符号数字。因此,大小小于2的向量会产生不确定的结果。

我知道我应该为循环使用一个无符号变量,但是它不能解决问题。所以我不得不通过类型转换或使用某些条件来处理它。

我的问题是,为什么STL为什么使用unsigned int来消除否定索引访问冲突并产生更多问题?

c++ size containers stl sizeof

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